Planning Analytics / TM1 Migration Readiness
When preparing to migrate a TM1 / IBM Planning Analytics model from an on-premises infrastructure to cloud, upgrade from an older Planning Analytics version to a newer one, or perform an audit of existing processes and chores, it is useful to understand how Turbo Integrator (TI) Processes and Chore definitions are represented in the underlying model files.
TI Processes (.pro) and Chore (.cho) files are TM1 object definition files stored in the data directory for v11 and earlier implementations of TM1. Within these files, many properties are represented by numeric control codes. Understanding these codes makes it possible to perform offline discovery against a copy of the model folder, even when the TM1 database is not running and cannot be accessed through Planning Analytics Workspace, the REST API, or TM1py.
This offline approach is especially useful during migration planning. Processes that use ODBC data sources, file-based data sources, cube views, dimension subsets, SAP/ODBO sources, Security Access, Unicode ODBC settings, or hard-coded paths can be identified quickly and grouped for further review.
For Planning Analytics as a Service and TM1 Database 12 migrations, ODBC processes may require changes to connector names, exposed data-source names, credentials, certificates, firewall/egress rules, or connector endpoints. File-based processes may need to be reviewed against the target environment’s file content area, File Manager, upload process, API approach, or approved integration pattern.
The same approach is also valuable for audit and governance. For example, processes with Security Access enabled can be identified and reviewed separately, since they are allowed to modify TM1 security data. Chore files can also be scanned to understand which processes are scheduled, whether chores are active, how frequently they run and whether they use single or multiple commit mode.
This article does not aim to provide a step-by-step guide to bulk editing model files. Instead, it explains how the control codes can be used for offline interrogation, migration impact analysis, audit, source-control comparison, and controlled remediation planning.
How to read the TI Process files
Most “records” are stored as <code>,<value> pairs.
Some records are multiline count blocks. For example, a script section for Prolog, Metadata, Data or Epilog can look like:
572,10
<10 Prolog lines follow>
When lines are added to a script block, the count after 572, 573, 574, or 575 is updated accordingly when the process is saved. Manual updates are possible but ill advised.
The same principle applies to data source variable blocks such as 577 through 582.
Code 565 is rather unique as it has encrypted data and stores the data-source password along with other internal information. The encrypted value of Code 565 changes on saving the process and should not be altered manually.
TI Process Control Codes
The below control codes relate to those found in a “.pro” file. There are some standard control codes for every process. Depending on what your process does, you may see a different set of these control codes e.g. those with a data source, those using the old mappings etc.
Observed / Known TI Process Control Codes
Code | Purpose / Friendly Name | Notes |
601 | FileVersionNumber | .pro file format/version record. Commonly observed as 100 |
602 | Name | Process name. |
562 | DataSourceType | Data source type. Examples include None, Text (CharacterDelimited, PositionDelimited), ODBC, Cube View, Dimension Subset, ODBO/SAP-type sources depending on version. |
586 | DataSourceNameForServer | Server-side data source name/path. |
585 | DataSourceNameForClient | Client-side data source name/path. |
564 | DataSourceUserName | Data source username. |
565 | DataSourcePassword | Encrypted/hash-like password payload. Do not manually edit; often excluded from source-control diffs. |
559 | ODBCInterfaceUsesUnicode | ODBC Unicode flag. |
928 | TargetActiveSandbox | Target active sandbox setting. |
593 | DataSourceODBOProvider | ODBO provider e.g. TM1OLAP |
594 | DataSourceODBOLocation | ODBO location/server. |
595 | DataSourceODBOCatalog | ODBO catalog. |
597 | DataSourceODBOSAPClientID | ODBO SAP client ID. |
598 | DataSourceODBOSAPClientLanguage | ODBO SAP client language. |
583 | DataSourceOleDbMdp | OLE DB Multidimensional Data Provider |
596 | DataSourceODBOConnectionString | ODBO connection string. |
800 | DataSourceODBOHierarchyName | ODBO hierarchy name. |
801 | DataSourceODBOCubeName | ODBO cube name. |
802 | DataSourceODBOHierarchyFilterLevels | ODBO hierarchy filter levels |
803 | DataSourceODBOHierarchyFilterLevelMembers | ODBO hierarchy filter level members |
566 | DataSourceQuery | SQL, MDX, or other query text depending on source type. |
567 | DataSourceASCIIDelimiter | Delimiter for ASCII/text data source. |
588 | DataSourceASCIIDecimalSeparator | Decimal separator for ASCII/text source. |
589 | DataSourceASCIIThousandSeparator | Thousand separator for ASCII/text source. |
568 | DataSourceASCIIQuoteCharacter | Quote character for ASCII/text source. |
570 | DataSourceCubeView | Cube view data source. |
571 | DataSourceDimensionSubset | Dimension subset data source. |
569 | DataSourceASCIIHeaderRecords | Number of header records for ASCII/text source. |
592 | OnMinorErrorDoItemSkip | Minor-error behaviour: skip item setting. |
599 | MinorErrorLogFileMax | Minor-error log maximum setting. |
560 | ParametersNames | Multiline parameter-name block. |
561 | ParametersTypes | Multiline parameter-type block. TM1Forum observations show 1 for numeric and 2 for string. |
590 | ParametersDefaultValues | Multiline parameter default values. |
637 | ParametersPromptStrings | Multiline prompt strings. |
577 | VariablesNames | Multiline variable-name block. |
578 | VariablesTypes | Multiline variable-type block. TM1Forum observations show 1 numeric and 2 string. |
579 | VariablesPositions | Multiline variable positions/order. |
580 | VariablesStartingBytes | Fixed-width starting byte positions. |
581 | VariablesEndingBytes | Fixed-width ending byte positions. |
582 | VariablesUIData | Variable Types: 32=String,33=Numeric, Type-Indicates Ignore,Other(827) etc. |
931 | DataSourceSAPShowSAPTechnicalNames | Show / use SAP technical names |
603 | VariablesUIDataEx | Extended variable UI / mapping metadata. Dimension mapping. |
572 | PrologProcedure | Multiline Prolog script block. Number of lines in Prolog. |
573 | MetaDataProcedure | Multiline Metadata script block. Number of lines in Metadata. |
574 | DataProcedure | Multiline Data script block. Number of lines in Data. |
575 | EpilogProcedure | Multiline Epilog script block. Number of lines in Epilog. |
576 | UIData | Maps tab / UI data, including generated action settings e.g. DataAction, CubeAction, CubeLogChanges,_ParameterConstraints |
930 | UIDataMore | Additional UI data. |
638 | Complete | Process-complete / syntactically complete flag. 0=Saved with errors/Incomplete, 1=Saved syntactically correct code. |
804 | DataSourceUseCallerProcessConnection | Use caller process connection setting. |
1217 | GrantSecurityAccess | Security Access: 0=No, 1=Yes |
Process lines | Purpose |
601,100 | FileVersionNumber |
602,”~S-SaveDataAll” | Name |
562,”NULL” | DataSourceType |
586, | DataSourceNameForServer |
585, | DataSourceNameForClient |
564, | DataSourceUserName |
565,”bQas…T@Ol” | DataSourceEncryptedData |
559,1 | ODBCInterfaceUsesUnicode |
928,0 | TargetActiveSandbox |
593, | DataSourceODBOProvider |
594, | DataSourceODBOLocation |
595, | DataSourceODBOCatalog |
597, | DataSourceODBOSAPClientID |
598, | DataSourceODBOSAPClientLanguage |
596, | DataSourceODBOConnectionString |
800, | DataSourceODBOHierarchyName |
801, | DataSourceODBOCubeName |
566,0 | DataSourceQuery |
567,”,” | DataSourceASCIIDelimiter |
588,”.” | DataSourceASCIIDecimalSeparator |
589, | DataSourceASCIIThousandSeparator |
568,”””” | DataSourceASCIIQuoteCharacter |
570, | DataSourceCubeView |
571, | DataSourceDimensionSubset |
569,0 | DataSourceASCIIHeaderRecords |
592,0 | OnMinorErrorDoItemSkip |
599,1000 | MinorErrorLogFileMax |
560,0 | ParametersNames |
561,0 | ParametersTypes |
590,0 | ParametersDefaultValues |
637,0 | ParametersPromptStrings |
577,0 | VariablesNames |
578,0 | VariablesTypes |
579,0 | VariablesPositions |
580,0 | VariablesStartingBytes |
581,0 | VariablesEndingBytes |
582,0 | VariablesUIData |
931,1 | DataSourceSAPShowSAPTechnicalNames |
603,0 | VariablesUIDataEx |
572,5 | PrologProcedure |
Prolog line 1 | |
#****Begin: Generated Statements*** | Prolog line 2 |
#****End: Generated Statements**** | Prolog line 3 |
Prolog line 4 | |
SaveDataAll; | Prolog line 5 |
573,3 | MetaDataProcedure |
Metadata line 1 | |
#****Begin: Generated Statements*** | Metadata line 2 |
#****End: Generated Statements**** | Metadata line 3 |
574,3 | DataProcedure |
Data line 1 | |
#****Begin: Generated Statements*** | Data line 2 |
#****End: Generated Statements**** | Data line 3 |
575,3 | EpilogProcedure |
Epilog line 1 | |
#****Begin: Generated Statements*** | Epilog line 2 |
#****End: Generated Statements**** | Epilog line 3 |
576,CubeAction=1511DataAction=1503CubeLogChanges=0 | UIData |
930,0 | UIDataMore |
638,1 | Complete |
804,0 | DataSourceUseCallerProcessConnection |
1217,0 | GrantSecurityAccess |
900, | DataSourceSAPClientId |
901, | DataSourceSAPLanguage |
902, | DataSourceSAPAddConnParams |
903, | DataSourceSAPInfoCubeName |
906, | DataSourceSAPCharacteristicName |
929, | DataSourceTopProcessName |
907, | DataSourceSAPHierarchyName |
908, | DataSourceSAPHierarchyVersion |
904,0 | DataSourceSAPInfoCubeCharacteristics |
905,0 | DataSourceSAPInfoCubeKeyFigures |
909,0 | DataSourceSAPCharacteristicAttributes |
911, | DataSourceSAPUserFilter |
912, | DataSourceSAPRoleFilter |
913, | DataSourceSAPTableName |
914, | DataSourceSAPExchangeType |
915, | DataSourceSAPCurrencyFrom |
916, | DataSourceSAPCurrencyTo |
917,0 | DataSourceSAPUsingRoleAuths |
918,1 | DataSourceSAPUsingTexts |
919,0 | DataSourceSAPInfocubeRestrictions |
920,50000 | SAPPacketSize |
921,”” | DataSourceSAPMaxDateFrom |
922,”” | DataSourceSAPMinDateTo |
923,0 | DataSourceSAPCharactHierProps |
924,”” | DataSourceSAPCharactAttrMaxDateFrom |
925,”” | DataSourceSAPCharactAttrMinDateTo |
926,”” | DataSourceSAPCharactTextsMaxDateFrom |
927,”” | DataSourceSAPCharactTextsMinDateTo |
A cautionary note. Processes can have one data source defined in the process properties but this can be changed or extended inside the Prolog, Metadata, Data, or Epilog sections.
For example, file names, ODBC DSN/Username/Password, output paths, AsciiOutput, TextOutput, ODBCOpen, ExecuteCommand, or DatasourceNameForServer assignments may appear inside the script blocks and alter what is seen in the initial datasource.
Ensure that you review Processes matching your search criteria to fully understand what the final usage is and how you would need to address this for the migration.
When reviewing security-sensitive processes, include both direct process execution and Chore execution. A Process with Security Access enabled may be locked down directly but still be executable through a Chore if the Chore security allows it. This makes the Process-to-Chore relationship an important discovery during audit and migration reviews.
Legacy SAP Connector Control Codes
The codes below are included for completeness and are particularly useful during upgrade or cloud-readiness reviews because they can identify legacy SAP/ODBO dependencies that may need to be retired, replaced, or revalidated.
The table is not sorted but left in the order typically observed in a Process.
Code | Constant / practical purpose | Notes |
931 | DataSourceSAPShowSAPTechnicalNames | Show / use SAP technical names (Duplicated here for completeness) |
900 | DataSourceSapClientId | SAP client ID. |
901 | DataSourceSapLanguage | SAP language. |
902 | DataSourceSapAddConnParams | SAP additional connection parameters. |
938 | DataSourceSapConnectionType | SAP connection type. |
937 | DataSourceSapCurrencyFrom | SAP currency-from setting. |
936 | DataSourceSapSystemNumber | SAP system number. |
935 | DataSourceSapRouterString | SAP router string. |
934 | DataSourceSapCodepage | SAP code page. |
932 | DataSourceSapInfoCubeThreadCount | SAP InfoCube thread count. |
933 | DataSourceSapInfoCubeThreadingCharacteristics | SAP InfoCube threading characteristics. |
903 | DataSourceSapInfoCubeName | SAP InfoCube name. |
906 | DataSourceSapCharacteristicName | SAP characteristic name. |
929 | DataSourceTopProcessName | Top/source process name, often relevant for generated connector processes. |
907 | DataSourceSapHierarchyName | SAP hierarchy name. |
908 | DataSourceSapHierarchyVersion | SAP hierarchy version. |
904 | DataSourceSapInfoCubeCharacteristics | SAP InfoCube characteristics. |
905 | DataSourceSapInfoCubeKeyFigures | SAP key figures. |
909 | DataSourceSapCharacteristicAttributes | SAP characteristic attributes. |
910 | DataSourceSapCharacteristicHierarchies | SAP characteristic hierarchies |
911 | DataSourceSapUserFilter | SAP user filter. |
912 | DataSourceSapRoleFilter | SAP role filter. |
913 | DataSourceSapTableName | SAP table name. |
914 | DataSourceSapExchangeType | SAP exchange type. |
915 | DataSourceSapCurrencyFrom | SAP currency-from setting. Seems both 915 and 937 have similar naming. |
916 | DataSourceSapCurrencyTo | SAP currency-to setting. |
917 | DataSourceSapUsingRoleAuths | SAP use role authorizations flag. |
918 | DataSourceSapUsingTexts | SAP use texts flag. |
919 | DataSourceSapInfocubeRestrictions | SAP InfoCube restrictions. |
920 | SapPacketSize | SAP packet size. |
921 | DataSourceSapMaxDateFrom | SAP max date-from setting. |
922 | DataSourceSapMinDateTo | SAP min date-to setting. |
923 | DataSourceSapCharactHierProps | SAP characteristic hierarchy properties. |
924 | DataSourceSapCharactAttrMaxDateFrom | SAP characteristic-attribute max date-from. |
925 | DataSourceSapCharactAttrMinDateTo | SAP characteristic-attribute min date-to. |
926 | DataSourceSapCharactTextsMaxDateFrom | SAP characteristic-texts max date-from. |
927 | DataSourceSapCharactTextsMinDateTo | SAP characteristic-texts min date-to. |
Practical Notes for Source Control and Automation
For .pro comparisons, exclude or normalize code 565 from comparisons and source code diffs as it can change without any meaningful logic change when the process is saved.
For .pro editing, avoid manual edits unless you understand related sections. Not every line is a control-code record. Maintaining the line counts and related metadata blocks is critical to avoid corrupted processes.
Script sections 572 to 575, parameters 560/561/590/637 and Variables 577 to 582/603 must remain internally consistent i.e. line counts must reflect the same number and have the relevant details for the section.
For migrations, use offline scanning to build the inventory and impact assessment, then apply changes through controlled methods such as the user interface, REST API, TM1py, deployment tooling, or carefully tested file-based updates where appropriate.
Chore Control Codes
A Chore file, .cho, is a container for one or more TM1 processes, with properties such as Name, StartTime, Frequency, ExecutionMode, and Tasks (TI Processes to execute).
Chore scanning is particularly useful during cutover planning because it identifies active schedules, disabled schedules, process execution order, parameterized process calls, and commit mode.
Just like with Processes, values and parameters are assigned to control codes that dictate the Chore’s behaviour.
Observed / Known Chore Control Codes
Code | Purpose/ Friendly Name | Notes |
534 | Chore file format/version header | 534,9 in older examples and 534,10 in newer examples. Appears at the top of the .cho file. |
535 | Chore name / display label | Example: 535,Daily Backup 9pm. |
530 | Chore start date/time | UTC/Z timestamp in YYYYMMDDHHMMSS format. Example: 20260522230100 = 2026-05-22 23:01:00 UTC. TM1Forum notes this is the scheduled start basis, not a continuously updated “next run” value. |
531 | Chore frequency / interval | DDDHHMMSS: days, hours, minutes, seconds. Example: 001000000 = every 1 day. |
532 | Number of processes/tasks in the chore | Multi-code section. Integer count of called processes. Codes 13, 6, 560 relate to each process in the chore. |
13 | Task/process-reference marker | Observed before a task’s process-name line, commonly as 13,16. This appears to be an internal object/task marker rather than a user-facing chore property. |
6 | Referenced process name within a chore task | Example: 6,”Server Backup” or 6,”Save Data”. |
560 | Parameter count / parameter-value block for the preceding task | Example: 560,0 means no parameters passed to that process task. |
533 | Active flag | 1 = Active, 0 = Inactive. |
1405 | Multiplecommit / execution mode flag | 1 = Multiple commit and 0 = Single commit. |
Chore lines | Notes |
534,10 | .cho file format/version record. Commonly observed as 10 |
535,Daily Save | Chore name / label. |
530,20260522230100 | Start basis: 2026-05-22 23:01:00 UTC |
531,001000000 | Frequency: every 001 days, 00 hours, 00 minutes, 00 seconds. |
532,1 | Count of Processes or tasks in the chore. In this case just the one. |
13,16 | Internal task/process-reference marker. |
6,”Server Backup” | The Process called by the task. |
560,0 | No parameters passed to Process being called. |
533,1 | 0=Inactive/not scheduled, 1 is Active. |
1405,0 | 0=Single-commit, 1=Multi-commit mode |
Use-Cases for Offline Search
Use-case | Purpose |
Offline cloud-readiness inventory | Classify processes as low-risk, file-dependent, ODBC-dependent, SAP/ODBO-dependent, security-sensitive, or schedule-sensitive. |
Process-to-chore dependency mapping | Identify which processes are manually executed only, chore-driven only, or both. |
Cutover planning | Identify active chores that should be disabled, rescheduled, or monitored during migration. |
Chore security review | Identify cases where a sensitive process may be executable through a chore even if direct process access is restricted. |
Security Access audit | Find 1217,1 processes and review who can run them, directly or indirectly. |
Credential remediation | Identify processes with stored ODBC credentials and plan secure credentials reset or connector configuration. |
Unicode consistency review | Identify ODBC processes where Unicode settings should be validated against source data and driver/connector behaviour. |
Hard-coded path discovery | Find file dependencies in both data-source fields and script blocks. |
Legacy connector decommissioning | Identify SAP/ODBO-related processes that may need replacement or retirement. |
Source-control diff cleanup | Normalize noisy fields such as encrypted data-source values so that code reviews focus on meaningful changes. |
Environment comparison | Compare development, test, and production for differences in data sources, Security Access, chore schedules, and process completeness. |
Incomplete process detection | Use 638 to identify processes saved with errors or incomplete syntax. |
Testing prioritisation | Prioritise migration testing for processes with external dependencies, security changes, chore execution, or file exports. |
Parameter review | Identify processes and chores that depend on runtime parameters, especially where parameter values are stored in chores. |
Sandbox review | Use the target sandbox setting to identify processes that may behave differently in sandboxed environments. |
Conclusion
Understanding TM1 Process and Chore control codes provides a practical way to interrogate a TM1 model offline. This is especially useful when the database is not running, cannot yet be connected to, or needs to be assessed before migration, upgrade, audit, or cutover activity begins.
The value of this approach is not simply that individual values or directives can be found in .pro and .cho files. The greater value is that the files can be scanned at scale to build an inventory of external dependencies, security-sensitive processes, scheduled activity, file-path usage, ODBC usage, legacy connector usage, unicode settings, and environment-specific configuration.
This makes control-code analysis a useful companion to Planning Analytics Workspace, the REST API, TM1Py, and other administration tools. Online tools are better suited for supported updates against a running model, while offline file analysis is valuable for discovery, comparison, triage, and migration planning.
Direct editing of process and chore files should be avoided and if really necessary, treated with care. Some sections contain line counts, encrypted values, generated metadata, and version-specific internal properties. For that reason, the safest use of these control codes is to identify impact, prioritise remediation, support governance reviews, and guide controlled updates that are then validated in a non-production environment.
In short, control codes turn the model’s data folder into a searchable source of migration and audit intelligence. Used carefully, they can reduce manual review effort, highlight hidden dependencies, and improve confidence before moving or changing a Planning Analytics model.
If you are looking at a migration to cloud, reviewing or auditing your model(s) and need assistance, please contact us and we will be happy to engage and advise further.
Sources: www.tm1forum.com, www.ibm.com (various pages), code.cubewise.com, exploringtm1.com
Disclaimer: This document does not server to replace the TM1 Migration utility provided by IBM which analyses your models in much the same way to highlight potential issues ahead of a v12/v3.1.x migration.
The reader undertakes to make any changes to the code at their own risk and understands that this article is to be used as a guideline and does not advocate a global “search and replace” strategy.