Как правильно заполнить поля переоценки в печатной форме ОС-6 при отсутствии данных?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При работе с печатными формами в 1С:Бухгалтерия предприятия 2.0, в частности с инвентарной карточкой ОС-6, часто возникает задача корректного вывода данных о переоценке основных средств. Проблема усложняется, когда данные в базе за последние годы отсутствуют, и требуется либо заполнить поля прочерками, либо продублировать предыдущие показатели. Рассмотрим, как избежать типичных ошибок при написании кода для заполнения параметров макета.

Анализ типичных ошибок в коде

Разберем ситуацию, когда разработчик пытается проверить заполненность параметров печатной формы с помощью функции ПустаяСтрока(). В сообщениях форума приводится пример кода, который не работает должным образом:


Если НЕ ПустаяСтрока (СтрокиРаздела3.Параметры.ДатаПереоценки2 И СтрокиРаздела3.Параметры.КоэффициентПереоценки2 И СтрокиРаздела3.Параметры.ВосстановительнаяСтоимостьПереоценки2) Тогда
    // Логика заполнения
КонецЕсли;

Проанализируем, почему такой подход ошибочен. Во-первых, функция ПустаяСтрока() предназначена исключительно для работы со строковыми типами данных. Параметры ДатаПереоценки (тип Дата) и ВосстановительнаяСтоимость (тип Число) не могут корректно обрабатываться этой функцией. Платформа попытается привести их к строке или булеву значению, что приведет к непредсказуемым результатам.

Во-вторых, использование оператора И внутри скобок функции превращает аргумент в единое логическое выражение (Булево). В итоге функция проверяет на «пустоту» результат логической операции, а не сами значения полей.

Правильная проверка заполнения полей

Для универсальной проверки того, заполнено ли поле любого типа (будь то число, дата или ссылка), в 1С предусмотрена функция ЗначениеЗаполнено(). Она корректно определяет «пустую» дату (01.01.0001) и нулевое число. Изменим логику проверки, сделав её более надежной:


Если ЗначениеЗаполнено(СтрокиРаздела3.Параметры.ДатаПереоценки2) 
    И ЗначениеЗаполнено(СтрокиРаздела3.Параметры.КоэффициентПереоценки2) Тогда
    // Выполняем действия, если данные есть
Иначе
    // Если данные не заполнены, подставляем прочерки или старые значения
КонецЕсли;

Решение проблемы деления на ноль

В алгоритме расчета коэффициента переоценки часто используется формула деления Восстановительной стоимости на Первоначальную. Проанализируем критически важный момент: если в базе данных первоначальная стоимость ОС не указана (равна нулю), программа выдаст критическую ошибку «Деление на 0». Чтобы этого избежать, всегда добавляйте проверку делителя:


Если ТаблицаПереоценок[0].ПервоначальнаяСтоимость <> 0 Тогда
    СтрокиРаздела3.Параметры.КоэффициентПереоценки = Окр(ТаблицаПереоценок[0].ВосстановительнаяСтоимость / ТаблицаПереоценок[0].ПервоначальнаяСтоимость, 2);
Иначе
    СтрокиРаздела3.Параметры.КоэффициентПереоценки = 0;
КонецЕсли;

Оптимизация заполнения через цикл

Вместо того чтобы вручную прописывать условия для каждого индекса таблицы (0, 1, 2 и так далее), что приводит к громоздкому и трудночитаемому коду, мы можем использовать цикл. Это позволит динамически обращаться к параметрам макета. Посмотрим, как это реализовать:


Для Сч = 0 По ТаблицаПереоценок.Количество() - 1 Цикл
    ИндексПараметра = ?(Сч = 0, "", Строка(Сч + 1)); // Формируем суффикс типа "2", "3"
    
    ТекСтрока = ТаблицаПереоценок[Сч];
    СтрокиРаздела3.Параметры["ДатаПереоценки" + ИндексПараметра] = ТекСтрока.Дата;
    
    Если ТекСтрока.ПервоначальнаяСтоимость <> 0 Тогда
        Коэф = ТекСтрока.ВосстановительнаяСтоимость / ТекСтрока.ПервоначальнаяСтоимость;
        СтрокиРаздела3.Параметры["КоэффициентПереоценки" + ИндексПараметра] = Окр(Коэф, 2);
    КонецЕсли;
    
    СтрокиРаздела3.Параметры["ВосстановительнаяСтоимостьПереоценки" + ИндексПараметра] = ТекСтрока.ВосстановительнаяСтоимость;
КонецЦикла;

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

Работа с форматом вывода

Важный нюанс при выводе «прочерков» (дефисов) в поля даты или числа: если в самом макете 1С для ячейки задан формат Дата или Число, то попытка записать туда строку "-------" может вызвать ошибку отображения.

Существует два способа решения этой задачи:

  1. Изменить тип значения в свойствах ячейки макета на Любой тип.
  2. Использовать свойство ячейки Текст в случае нулевого значения в самом макете, прописав там нужные символы. В этом случае в коде достаточно оставить значение пустым или нулевым.

Подводя итог, отметим, что для корректного заполнения формы ОС-6 необходимо четко разделять типы данных, использовать ЗначениеЗаполнено() вместо ПустаяСтрока() и предусматривать проверки на наличие данных в регистре переоценки, чтобы избежать пустых полей в печатном документе.

← На главную