При разработке внешних печатных форм или обработок часто возникает необходимость получить значение дополнительного реквизита, который был создан пользователем в режиме «1С:Предприятие». Особенно часто это требуется для проверки состояния различных флажков (чекбоксов), например: «Оригинал получен», «Документ проверен» или «Счет согласован». В этой статье мы подробно разберем, как правильно обращаться к таким данным, проанализируем типичные ошибки и рассмотрим несколько способов решения задачи: от простого перебора табличной части до использования мощных инструментов Библиотеки стандартных подсистем (БСП).
Рассмотрим ситуацию, с которой часто сталкиваются начинающие разработчики. При попытке получить значение реквизита программно, часто допускается логическая ошибка в проверке условий. Давайте проанализируем фрагмент кода:
ИИ = "ОригиналДокументаВБухгалтерии_8f6b7451c4104aaf82656a6521318a74";
Если ИИ Тогда
Реквизит = 1;
Иначе
Реквизит = 0;
КонецЕсли;
В данном примере переменной ИИ присваивается строковое значение (внутренний идентификатор или имя реквизита). В языке 1С попытка использовать строку в операторе Если приводит к тому, что условие всегда будет вычисляться некорректно или вызывать ошибку преобразования типов. Программа не понимает, что вы хотите проверить значение реквизита с таким именем, она просто видит текст. Чтобы получить реальное значение флажка (типа Булево), необходимо обратиться к данным объекта или выполнить запрос.
В современных конфигурациях, таких как 1С:Бухгалтерия 3.0, Управление торговлей 11 или ERP, реализован специальный механизм для работы с дополнительными свойствами. Самый быстрый и правильный способ получить значение — воспользоваться функциями общего модуля УправлениеСвойствами.
Для того чтобы узнать значение флажка, нам достаточно знать ссылку на документ и имя (или заголовок) дополнительного реквизита. Рассмотрим пример кода:
// СсылкаНаДокумент - это наш объект (например, Счет на оплату)
// ИмяРеквизита - это имя, заданное при создании доп. реквизита
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "ОригиналСчетаНаОплатувБухгалтерии");
Если ЗначениеСвойства = Истина Тогда
// Флажок установлен
ДанныеПечати.Вставить("ОригиналПолучен", "Да");
Иначе
// Флажок не установлен или реквизит отсутствует
ДанныеПечати.Вставить("ОригиналПолучен", "Нет");
КонецЕсли;
Этот метод хорош тем, что он автоматически обрабатывает ситуацию, когда строка с реквизитом еще не создана в табличной части документа. В этом случае функция просто вернет Ложь или Неопределено.
Если вы пишете внешнюю печатную форму и вам нужно получить данные сразу для большого списка документов, использование функций в цикле будет сильно замедлять работу (приводить к «N+1» проблеме запросов). В этом случае эффективнее включить получение дополнительного реквизита в основной запрос печатной формы.
Выясним причину, по которой это работает быстрее: запрос обращается напрямую к таблице базы данных. Дополнительные реквизиты хранятся в подчиненной табличной части ДополнительныеРеквизиты каждого документа.
Рассмотрим структуру запроса:
ВЫБРАТЬ
СчетНаОплату.Ссылка КАК Ссылка,
ЕСТЬNULL(ДопРеквизиты.Значение, ЛОЖЬ) КАК ФлажокОригинал
ИЗ
Документ.СчетНаОплату КАК СчетНаОплату
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплату.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО ДопРеквизиты.Ссылка = СчетНаОплату.Ссылка
И ДопРеквизиты.Свойство.Заголовок = "Оригинал получен"
ГДЕ
СчетНаОплату.Ссылка В(&МассивСсылок)
В данном запросе мы соединяем основную таблицу документов с таблицей доп. реквизитов. Обратите внимание на условие по Свойство.Заголовок. Это позволяет нам отфильтровать только нужный нам флажок. Использование ЕСТЬNULL гарантирует, что если реквизит не заполнен, мы получим значение Ложь.
Если по каким-то причинам вы не можете использовать БСП или запрос, можно проанализировать коллекцию дополнительных реквизитов документа вручную. Проанализируем, как это сделать правильно в коде функции:
Функция ПолучитьЗначениеФлажка(ДокументСсылка) Экспорт
// Получаем объект или читаем напрямую из ссылки (через точку)
Для Каждого СтрокаРеквизита Из ДокументСсылка.ДополнительныеРеквизиты Цикл
// Сравниваем либо заголовок, либо имя, либо GUID свойства
Если СтрокаРеквизита.Свойство.Заголовок = "Оригинал получен" Тогда
Возврат СтрокаРеквизита.Значение; // Вернет Истина или Ложь
КонецЕсли;
КонецЦикла;
Возврат Ложь; // Если не нашли такой реквизит
КонецФункции
Важный момент: Если вы знаете GUID (Уникальный идентификатор) свойства, это сделает ваш код более надежным, так как пользователи могут переименовать «Заголовок» реквизита в интерфейсе, но идентификатор в базе останется прежним.
Для поиска по идентификатору используем метод:
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Новый УникальныйИдентификатор("8f6b7451-c410-4aaf-8265-6a6521318a74"))
Для эффективной работы с флажками в 1С рекомендуем придерживаться следующих правил:
УправлениеСвойствами.ЗначениеСвойства().ДополнительныеРеквизиты.Если "Имя" Тогда, так как это не обращается к данным базы.Неопределено или отсутствие строки в таблице), и обрабатывайте это как Ложь.Используя эти методы, вы сможете быстро и надежно извлекать любые пользовательские данные для ваших программных разработок.