При разработке печатных форм в среде «1С:Предприятие» программисты иногда сталкиваются с поведением системы, которое на первый взгляд кажется необъяснимым или даже «магическим». Типичная ситуация: вы создаете макет, определяете параметры, пишете код для их заполнения, но при формировании документа вместо числовых данных или пустых значений в ячейках красуется слово «НЕТ». В этой статье мы подробно разберем, почему это происходит, как 1С интерпретирует ваш код и как избежать подобных ошибок в будущем.
Рассмотрим пример кода, который часто становится причиной недоумения. Представьте, что вы решили инициализировать параметры макета или просто в спешке написали следующую строку:
ОбластьСсылка.Параметры.ПрибыльПрогноз = ОбластьСсылка.Параметры.ПрибыльПрогнозПроцент = Значение;
На первый взгляд кажется, что мы просто присваиваем обоим параметрам некое Значение. Однако, после выполнения этого кода в параметре ПрибыльПрогноз оказывается значение Ложь, которое при выводе в табличный документ (макет) автоматически преобразуется в строковое представление «Нет». Проанализируем, почему система ведет себя именно так.
Первое и самое важное правило, которое нам необходимо усвоить: в языке программирования 1С не существует цепочечного присваивания. Если в таких языках, как C++, JavaScript или Python, выражение A = B = C последовательно присваивает значение C переменной B, а затем результат этой операции — переменной A, то в 1С логика работы оператора = в корне отличается.
В языке 1С символ = выполняет две принципиально разные функции в зависимости от контекста его использования в строке кода:
Если или Пока). Оно указывает системе, что значение, вычисленное справа от знака, нужно записать в переменную, стоящую слева.= в этой же инструкции интерпретируются компилятором как логическая операция «равно ли?». Результатом такой операции всегда является тип данных Булево (Истина или Ложь).Таким образом, наша строка кода превращается для системы в следующее выражение:
ОбластьСсылка.Параметры.ПрибыльПрогноз = (ОбластьСсылка.Параметры.ПрибыльПрогнозПроцент = Значение);
Давайте проанализируем ситуацию по шагам, чтобы понять, как получается итоговый результат:
ОбластьСсылка.Параметры.ПрибыльПрогнозПроцент = Значение.ОбластьСсылка.Параметры.ПрибыльПрогнозПроцент, скорее всего, еще не инициализирован и имеет значение Неопределено.Неопределено = Значение. Так как эти величины не равны, результатом операции сравнения становится Ложь.ОбластьСсылка.Параметры.ПрибыльПрогноз) записывается результат вычисления правой части, то есть Ложь.В итоге мы имеем параметр макета, тип данных которого изменился на Булево, а значение установилось в Ложь.
Теперь выясним причину появления текстового слова в печатной форме. В платформе «1С:Предприятие» реализовано неявное преобразование типов. Когда объект ТабличныйДокумент выводит значение типа Булево в ячейку, он применяет к нему стандартное строковое представление, принятое в текущей локализации системы.
В русской локализации соответствие следующее:
Истина преобразуется в строку «Да».Ложь преобразуется в строку «Нет».Если бы вы заглянули в свойства ячейки макета, вы бы увидели там параметр Формат. Если он пустой, система использует системные настройки. Вы могли бы изменить это поведение, задав в формате ячейки свои значения для логических типов, например: БЛ='0'; БИ='1' или БЛ='Отсутствует'; БИ='В наличии'. Но по умолчанию 1С всегда будет писать «Нет» для ложного значения.
Многих разработчиков сбивает с толку тот факт, что Синтакс-помощник и стандартная проверка конфигурации не выдают ошибку на подобный код. Рассмотрим, почему это происходит. С точки зрения синтаксиса языка 1С, конструкция А = Б = В является абсолютно корректной. Это не ошибка, а логическое выражение. Вы имеете полное право присвоить переменной результат сравнения двух других переменных.
Пример корректного использования такой логики:
ДокументПроведен = (Статус = Перечисления.Статусы.Проведен);
Здесь переменной ДокументПроведен присвоится Истина, если условие в скобках выполняется. В случае с «магией» в макете, скобки просто отсутствуют, но приоритет операций заставляет систему работать по той же схеме.
Чтобы избежать подобных ситуаций и сделать код читаемым и надежным, следует придерживаться правила: одна строка — одна операция присваивания. Рассмотрим правильные варианты заполнения параметров макета.
Вариант 1: Раздельное присваивание
ОбластьСсылка.Параметры.ПрибыльПрогноз = 0;
ОбластьСсылка.Параметры.ПрибыльПрогнозПроцент = 0;
Вариант 2: Использование структуры (если применимо)
Если вы заполняете параметры из данных выборки или структуры, лучше использовать метод Заполнить(), который разом перенесет все значения из источника в параметры области макета, сопоставив их по именам:
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("ПрибыльПрогноз", РезультатЗапроса.Прибыль);
СтруктураДанных.Вставить("ПрибыльПрогнозПроцент", РезультатЗапроса.Процент);
ОбластьСсылка.Параметры.Заполнить(СтруктураДанных);
Мы выяснили, что «магия» в 1С всегда имеет под собой четкое техническое обоснование. Появление слова «НЕТ» в макете — это классический пример того, как особенности синтаксиса (трактовка знака =) накладываются на механизмы платформы по визуализации данных.
Подведем итоги нашего анализа:
= после первого в одной инструкции — это сравнение, а не присваивание.Формат в макете, если хотите изменить стандартное отображение «Да/Нет».Соблюдение этих простых правил поможет вам писать чистый и предсказуемый код, а «магия» в ваших макетах будет только запланированной и полезной для пользователей.