Как программно узнать значение дополнительного реквизита или флажка в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разбор типичной ошибки: почему код может не работать

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


ИИ = "ОригиналДокументаВБухгалтерии_8f6b7451c4104aaf82656a6521318a74";
Если ИИ Тогда 
    Реквизит = 1; 
Иначе 
    Реквизит = 0; 
КонецЕсли;

В данном примере переменной ИИ присваивается строковое значение (внутренний идентификатор или имя реквизита). В языке 1С попытка использовать строку в операторе Если приводит к тому, что условие всегда будет вычисляться некорректно или вызывать ошибку преобразования типов. Программа не понимает, что вы хотите проверить значение реквизита с таким именем, она просто видит текст. Чтобы получить реальное значение флажка (типа Булево), необходимо обратиться к данным объекта или выполнить запрос.

Способ 1: Использование стандартных функций БСП (рекомендуемый)

В современных конфигурациях, таких как 1С:Бухгалтерия 3.0, Управление торговлей 11 или ERP, реализован специальный механизм для работы с дополнительными свойствами. Самый быстрый и правильный способ получить значение — воспользоваться функциями общего модуля УправлениеСвойствами.

Для того чтобы узнать значение флажка, нам достаточно знать ссылку на документ и имя (или заголовок) дополнительного реквизита. Рассмотрим пример кода:


// СсылкаНаДокумент - это наш объект (например, Счет на оплату)
// ИмяРеквизита - это имя, заданное при создании доп. реквизита

ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "ОригиналСчетаНаОплатувБухгалтерии");

Если ЗначениеСвойства = Истина Тогда
    // Флажок установлен
    ДанныеПечати.Вставить("ОригиналПолучен", "Да");
Иначе
    // Флажок не установлен или реквизит отсутствует
    ДанныеПечати.Вставить("ОригиналПолучен", "Нет");
КонецЕсли;

Этот метод хорош тем, что он автоматически обрабатывает ситуацию, когда строка с реквизитом еще не создана в табличной части документа. В этом случае функция просто вернет Ложь или Неопределено.

Способ 2: Получение значения через запрос (для печатных форм)

Если вы пишете внешнюю печатную форму и вам нужно получить данные сразу для большого списка документов, использование функций в цикле будет сильно замедлять работу (приводить к «N+1» проблеме запросов). В этом случае эффективнее включить получение дополнительного реквизита в основной запрос печатной формы.

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

Рассмотрим структуру запроса:


ВЫБРАТЬ
    СчетНаОплату.Ссылка КАК Ссылка,
    ЕСТЬNULL(ДопРеквизиты.Значение, ЛОЖЬ) КАК ФлажокОригинал
ИЗ
    Документ.СчетНаОплату КАК СчетНаОплату
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплату.ДополнительныеРеквизиты КАК ДопРеквизиты
        ПО ДопРеквизиты.Ссылка = СчетНаОплату.Ссылка
        И ДопРеквизиты.Свойство.Заголовок = "Оригинал получен"
ГДЕ
    СчетНаОплату.Ссылка В(&МассивСсылок)

В данном запросе мы соединяем основную таблицу документов с таблицей доп. реквизитов. Обратите внимание на условие по Свойство.Заголовок. Это позволяет нам отфильтровать только нужный нам флажок. Использование ЕСТЬNULL гарантирует, что если реквизит не заполнен, мы получим значение Ложь.

Способ 3: Обращение к табличной части объекта (ручной перебор)

Если по каким-то причинам вы не можете использовать БСП или запрос, можно проанализировать коллекцию дополнительных реквизитов документа вручную. Проанализируем, как это сделать правильно в коде функции:


Функция ПолучитьЗначениеФлажка(ДокументСсылка) Экспорт
    
    // Получаем объект или читаем напрямую из ссылки (через точку)
    Для Каждого СтрокаРеквизита Из ДокументСсылка.ДополнительныеРеквизиты Цикл
        
        // Сравниваем либо заголовок, либо имя, либо GUID свойства
        Если СтрокаРеквизита.Свойство.Заголовок = "Оригинал получен" Тогда
            Возврат СтрокаРеквизита.Значение; // Вернет Истина или Ложь
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Ложь; // Если не нашли такой реквизит

КонецФункции

Важный момент: Если вы знаете GUID (Уникальный идентификатор) свойства, это сделает ваш код более надежным, так как пользователи могут переименовать «Заголовок» реквизита в интерфейсе, но идентификатор в базе останется прежним.

Для поиска по идентификатору используем метод:

ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Новый УникальныйИдентификатор("8f6b7451-c410-4aaf-8265-6a6521318a74"))

Подведем итоги

Для эффективной работы с флажками в 1С рекомендуем придерживаться следующих правил:

  1. Для разового получения значения в коде используйте УправлениеСвойствами.ЗначениеСвойства().
  2. В печатных формах и отчетах всегда используйте Запросы с левым соединением к табличной части ДополнительныеРеквизиты.
  3. Никогда не проверяйте имя реквизита простым условием Если "Имя" Тогда, так как это не обращается к данным базы.
  4. При проверке булевых значений (флажков) всегда учитывайте возможность того, что реквизит может быть не установлен (значение Неопределено или отсутствие строки в таблице), и обрабатывайте это как Ложь.

Используя эти методы, вы сможете быстро и надежно извлекать любые пользовательские данные для ваших программных разработок.

← На главную