При обработке стажевых периодов в документе персонифицированного учета (например, СЗВ-СТАЖ) разработчики иногда сталкиваются с проблемой: если у одного сотрудника количество записей превышает 99, при выгрузке в XML или формировании печатных форм попадают только первые 99 записей. При этом код увеличения счетчика в цикле выглядит вполне корректно, однако итоговое значение в строке таблицы не превышает 99.
В этой статье мы подробно проанализируем причину такого поведения платформы 1С:Предприятие и рассмотрим способы решения данной проблемы.
Проанализируем алгоритм обхода записей, в котором возникает ошибка:
// Нумерация записей стажа
НомерОсновнойЗаписи = 0;
НомерСтроки = 0;
Для Каждого СтрокаСтажа Из ВременнаяТаблицаФизлица Цикл
НомерСтроки = НомерСтроки + 1;
ТекстОшибкиСНомеромСтроки = "В строке стажа " + НомерСтроки + ": ";
// Контролируем смену основной записи
Если ЗначениеЗаполнено(СтрокаСтажа.ДатаНачалаПериода) И ЗначениеЗаполнено(СтрокаСтажа.ДатаОкончанияПериода) Тогда
// Встретили основную запись
НомерОсновнойЗаписи = НомерОсновнойЗаписи + 1;
НомерДополнительнойЗаписи = 0;
ИначеЕсли Не ЗначениеЗаполнено(СтрокаСтажа.ДатаНачалаПериода) И Не ЗначениеЗаполнено(СтрокаСтажа.ДатаОкончанияПериода) Тогда
Если НомерОсновнойЗаписи <> 0 Тогда
НомерДополнительнойЗаписи = НомерДополнительнойЗаписи + 1;
КонецЕсли;
КонецЕсли;
СтрокаСтажа.НомерОсновнойЗаписи = НомерОсновнойЗаписи;
СтрокаСтажа.НомерДополнительнойЗаписи = НомерДополнительнойЗаписи;
КонецЦикла;
Локальная переменная модуля НомерОсновнойЗаписи не имеет жесткого ограничения типа, поэтому в цикле она успешно увеличивается до 100, 101 и далее. Ограничение возникает в момент присвоения значения реквизиту СтрокаСтажа.НомерОсновнойЗаписи.
Выясним причину этого явления: колонка НомерОсновнойЗаписи во временной таблице была сформирована с квалификатором типа Число(2, 0). В платформе 1С:Предприятие при попытке записать в колонку таблицы значений с жестко заданным типом Число(2, 0) значение, превышающее 99 (например, 100), платформа не генерирует ошибку выполнения. Вместо этого значение автоматически усекается до максимально допустимого числа для заданной разрядности — то есть до 99.
Разберем по шагам варианты устранения проблемы в коде конфигурации.
Если таблица значений создается программно через добавление колонок или копирование структуры, необходимо изменить разрядность числового квалификатора с 2 до 5 знаков (или более, в зависимости от требований).
Рассмотрим, как правильно инициализировать тип колонки в таблице значений с нужной разрядностью:
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
// Задаем длину 5 знаков и 0 знаков после запятой
КвалификаторЗначения = Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный);
ОписаниеТипаЧисло = Новый ОписаниеТипов(МассивТипов, КвалификаторЗначения);
// Добавляем колонку с новым описанием типа
ТаблицаЗаписиОСтаже.Колонки.Добавить("НомерОсновнойЗаписи", ОписаниеТипаЧисло);
Если колонка используется исключительно во внутренних расчетах и алгоритмах обработки данных, можно объявить колонку таблицы значений без указания типов:
// Колонка без указания описания типов не ограничивается квалификаторами
ТаблицаЗаписиОСтаже.Колонки.Добавить("НомерОсновнойЗаписи");
В нетипизированную колонку таблицы значений можно записывать числа любой разрядности. Однако если результат в дальнейшем передается в объект метаданных (например, в табличную часть документа или реквизит), разрядность соответствующего реквизита в конфигураторе также должна быть достаточно большой (например, Число(5, 0)).
Соблюдение этих правил позволит избежать незаметной потери или искажения данных при выгрузке больших объемов стажевых периодов и формировании регламентированной отчетности.