В утилте интеграции с 1С реализовать возможность обновления табличной части в 1С

Сейчас при экспорте в табличную часть документа/справочника в 1С всегда происходит добавление новой строки, а не ее поиск и обновление текущими данными из Террасофт. Таким образом, если не очищать каждый раз табличную часть, то в нее происходит добавление N строк, где N - количество строк в соответствующем датасете (например, детали) в Террасофт.Предлагаю реализовать возможность обновления строк в табличной части документа/справочника в 1С. В качестве ключевого поля использовать НомерСтроки. Конечно, со стороны Террасофт тоже должно быть аналогичное поле, которое хранит номер строки (ранее я озвучил идею добавления нумерации строк для детали "Продукты"). Для чего это нужно? В ситуации, когда в табличной части 1С храниться важная информация, которую нельзя просто так удалять/затирать, пригодиться эта возможность именно обновления данных в строке, а нее удаления и нового добавления. Алгоритм следующий. Для примера возьмем деталь "Продукты" и табличную часть документа. В детали "Продукты" заранее было добавлено поле "Номер", которое автоматически ставиться больше на 1 для каждой новой записи. При настройке синхронизации детали сопоставляем поле "Номер" в Террасофт с полем "НомерСтроки" в 1С. Снимаем галочку с поля "Не экспортировать", что будет в дальнейшем сигналом для обновления строк в табличной части, а не для их добавления. Если в настройках синхронизации табличной части не стоит "Очищать табличную часть", сопоставлено поле "НомерСтроки" с полем в Террасофт, не стоит галочка "Не экспортировать", то происходит обновление строки табличной части, а не добавление. Если при экспорте такого номера строки не находит, то происходит добавление строки. Пример как это сейчас сделано у меня. В функции ExportFields, чтобы избежать попытки записи в поле НомерСтроки, добавляем пропуск этого поля: // Kosh. 11.01.14. Modified: added skip LineNumber change if ((!IsAppend && !ObjectField.IsEdit) || IsEmptyValue(ObjectField.Name1C) || (Param.IsTabularSection && ObjectField.Name1C == 'НомерСтроки')) { // * Kosh         continue; } В функции ExportObject изменить код, где мы получаем Select1C строки табличной части: if (Param.IsTabularSection) {         Param.IsAppend = true;         if (Param.Version != 'V77') {                 // Kosh. 11.01.14. Modified: possibility to change line in tabular section                 var LineNumberObj = GetLineNumberObj(ObjectFields, Dataset);                 if (Param.DeleteData || !LineNumberObj.UseLineNumber) {                         Select1C = Param.Select1C[Param.TabularSectionName].Add();                 } else {                         Param.IsAppend = false;                         try {                                 Select1C = Param.Select1C[Param.TabularSectionName].                                         Get(LineNumberObj.LineNumber - 1);                         } catch(e) {                                 if (e.message.indexOf('Значение индекса выходит за границы диапазона') != -1 ) {                                         Param.IsAppend = true;                                         Select1C = Param.Select1C[Param.TabularSectionName].Add();                                 } else {                                         throw e.message;                                 }                         }                 }                 // * Kosh         } else { Используется функция: function GetLineNumberObj(ObjectFields, Dataset) {         var Result = {};         Result.UseLineNumber = false;         Result.LineNumber = 0;         for (var i = 0; i ObjectFields.length; i++) {                 if (ObjectFields[i].Name1C == 'НомерСтроки') {                         var ObjectField = ObjectFields[i];                         if (!ObjectField.DoNot && !IsEmptyValue(ObjectField.NameTS)) {                                 var TSLineNumber = Dataset(ObjectField.NameTS);                                 if (TSLineNumber) {                                         Result.LineNumber = TSLineNumber;                                         Result.UseLineNumber = true;                                 }                         }                         break;                 }         }         return Result; } Пример сделан для конфигурации 8.0-8.2.
1 комментарий

Добрый день!

Идея передана в проектный департамент на рассмотрение.
Как только будет решение, мы обязательно сообщим.

Показать все комментарии