Почему в 1С усекается значение переменной или колонки таблицы значений до 99?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом Налоговый учет
← На главную

При обработке стажевых периодов в документе персонифицированного учета (например, СЗВ-СТАЖ) разработчики иногда сталкиваются с проблемой: если у одного сотрудника количество записей превышает 99, при выгрузке в XML или формировании печатных форм попадают только первые 99 записей. При этом код увеличения счетчика в цикле выглядит вполне корректно, однако итоговое значение в строке таблицы не превышает 99.

В этой статье мы подробно проанализируем причину такого поведения платформы 1С:Предприятие и рассмотрим способы решения данной проблемы.

Особенности платформы 1С при работе с разрядностью чисел

Проанализируем алгоритм обхода записей, в котором возникает ошибка:


// Нумерация записей стажа 
НомерОсновнойЗаписи = 0; 
НомерСтроки = 0;
Для Каждого СтрокаСтажа Из ВременнаяТаблицаФизлица Цикл
    
    НомерСтроки = НомерСтроки + 1;
    ТекстОшибкиСНомеромСтроки = "В строке стажа " + НомерСтроки + ": ";
    
    // Контролируем смену основной записи
    Если ЗначениеЗаполнено(СтрокаСтажа.ДатаНачалаПериода) И ЗначениеЗаполнено(СтрокаСтажа.ДатаОкончанияПериода) Тогда
        // Встретили основную запись
        НомерОсновнойЗаписи = НомерОсновнойЗаписи + 1; 
        НомерДополнительнойЗаписи = 0;
    ИначеЕсли Не ЗначениеЗаполнено(СтрокаСтажа.ДатаНачалаПериода) И Не ЗначениеЗаполнено(СтрокаСтажа.ДатаОкончанияПериода) Тогда    
        Если НомерОсновнойЗаписи <> 0 Тогда
            НомерДополнительнойЗаписи = НомерДополнительнойЗаписи + 1; 
        КонецЕсли;
    КонецЕсли;    
    
    СтрокаСтажа.НомерОсновнойЗаписи = НомерОсновнойЗаписи;
    СтрокаСтажа.НомерДополнительнойЗаписи = НомерДополнительнойЗаписи;
    
КонецЦикла;

Локальная переменная модуля НомерОсновнойЗаписи не имеет жесткого ограничения типа, поэтому в цикле она успешно увеличивается до 100, 101 и далее. Ограничение возникает в момент присвоения значения реквизиту СтрокаСтажа.НомерОсновнойЗаписи.

Выясним причину этого явления: колонка НомерОсновнойЗаписи во временной таблице была сформирована с квалификатором типа Число(2, 0). В платформе 1С:Предприятие при попытке записать в колонку таблицы значений с жестко заданным типом Число(2, 0) значение, превышающее 99 (например, 100), платформа не генерирует ошибку выполнения. Вместо этого значение автоматически усекается до максимально допустимого числа для заданной разрядности — то есть до 99.

Как исправить ограничение разрядности

Разберем по шагам варианты устранения проблемы в коде конфигурации.

Если таблица значений создается программно через добавление колонок или копирование структуры, необходимо изменить разрядность числового квалификатора с 2 до 5 знаков (или более, в зависимости от требований).

Способ 1. Явное задание квалификаторов числа при создании колонки

Рассмотрим, как правильно инициализировать тип колонки в таблице значений с нужной разрядностью:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));

// Задаем длину 5 знаков и 0 знаков после запятой
КвалификаторЗначения = Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный);
ОписаниеТипаЧисло = Новый ОписаниеТипов(МассивТипов, КвалификаторЗначения);

// Добавляем колонку с новым описанием типа
ТаблицаЗаписиОСтаже.Колонки.Добавить("НомерОсновнойЗаписи", ОписаниеТипаЧисло);

Способ 2. Использование нетипизированных колонок для промежуточных вычислений

Если колонка используется исключительно во внутренних расчетах и алгоритмах обработки данных, можно объявить колонку таблицы значений без указания типов:


// Колонка без указания описания типов не ограничивается квалификаторами
ТаблицаЗаписиОСтаже.Колонки.Добавить("НомерОсновнойЗаписи");

В нетипизированную колонку таблицы значений можно записывать числа любой разрядности. Однако если результат в дальнейшем передается в объект метаданных (например, в табличную часть документа или реквизит), разрядность соответствующего реквизита в конфигураторе также должна быть достаточно большой (например, Число(5, 0)).

Соблюдение этих правил позволит избежать незаметной потери или искажения данных при выгрузке больших объемов стажевых периодов и формировании регламентированной отчетности.

← На главную