Сейчас при экспорте в табличную часть документа/справочника в 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.
Понравилась ли вам эта идея?