При работе с печатными формами в 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С для ячейки задан формат Дата или Число, то попытка записать туда строку "-------" может вызвать ошибку отображения.
Существует два способа решения этой задачи:
Подводя итог, отметим, что для корректного заполнения формы ОС-6 необходимо четко разделять типы данных, использовать ЗначениеЗаполнено() вместо ПустаяСтрока() и предусматривать проверки на наличие данных в регистре переоценки, чтобы избежать пустых полей в печатном документе.