Как получить на клиенте элемент Без НДС справочника Ставки НДС

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет
← На главную

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

Анализируем причину проблемы: почему ПредопределенноеЗначение не работает

Рассмотрим стандартную ситуацию: программист пытается получить ставку НДС привычным способом, используя код:

СтавкаБезНДС = ПредопределенноеЗначение("Справочник.СтавкиНДС.БезНДС");

Система выдает ошибку, так как в конфигураторе у справочника СтавкиНДС отсутствуют предопределенные элементы. В современных конфигурациях (УНФ 1.6/3.0, ERP, Бухгалтерия предприятия 3.0) элементы этого справочника создаются программно при первом запуске или обновлении информационной базы. Это так называемые «псевдопредопределенные» данные.

Проанализируем структуру справочника СтавкиНДС. В нем нет жестко заданных имен в дереве метаданных, а значит, платформа не знает идентификатора БезНДС. Кроме того, наименование элемента «Без НДС» содержит пробел, что в принципе недопустимо для обращения через точку в коде 1С, так как нарушает правила именования переменных и объектов.

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

Разработчики типовых конфигураций предусмотрели специальные методы в модуле менеджера справочника СтавкиНДС. Это позволяет избежать «велосипедов» и гарантирует получение корректной ссылки, даже если пользователь изменил наименование элемента вручную. Поскольку нам нужно получить значение на клиенте, мы должны создать серверную обертку.

Разберем по шагам, как это реализовать:

  1. Создадим на форме (или в общем модуле) функцию с директивой &НаСервереБезКонтекста.
  2. Внутри функции обратимся к экспортному методу справочника.
  3. Вызовем эту функцию с клиента.

Рассмотрим пример кода:


&НаКлиенте
Процедура УстановитьСтавкуНДС(Команда)
    
    // Получаем ссылку на элемент справочника через серверный вызов
    СтавкаБезНДС = ПолучитьСтавкуБезНДСНаСервере();
    
    // Присваиваем значение реквизиту формы
    Объект.СтавкаНДС = СтавкаБезНДС;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСтавкуБезНДСНаСервере()
    
    // В большинстве современных конфигураций УНФ и БСП 
    // в модуле менеджера есть готовые функции:
    Возврат Справочники.СтавкиНДС.БезНДС();
    
КонецФункции

Решение 2: Поиск элемента через перечисление

Если в вашей версии конфигурации метод Справочники.СтавкиНДС.БезНДС() отсутствует, проанализируем взаимосвязь объектов. В справочнике СтавкиНДС почти всегда есть реквизит (например, ВариантСтавкиНДС или СтавкаНДС), который имеет тип ПеречислениеСсылка.СтавкиНДС. Элементы перечисления являются предопределенными и к ним можно обращаться напрямую.

Посмотрим на пример функции, которая ищет элемент справочника по соответствующему значению перечисления:


&НаСервереБезКонтекста
Функция НайтиСтавкуНДСПоПеречислению()
    
    // Определяем значение перечисления, которое нам нужно найти
    ЦелевоеПеречисление = Перечисления.СтавкиНДС.БезНДС;
    
    // Ищем элемент справочника, у которого реквизит соответствует перечислению
    // Имя реквизита "СтавкаНДС" может отличаться в зависимости от версии УНФ
    СсылкаНаСтавку = Справочники.СтавкиНДС.НайтиПоРеквизиту("СтавкаНДС", ЦелевоеПеречисление);
    
    Возврат СсылкаНаСтавку;
    
КонецФункции

Решение 3: Универсальный поиск через запрос

Выясним, как поступить, если предыдущие методы не подходят. Самый производительный и «чистый» способ получения ссылки на сервере — это использование запроса. Это защитит нас от проблем, если в справочнике по какой-то причине создано несколько дублей (хотя система обычно этого не допускает).

Рассмотрим пример реализации:


&НаСервереБезКонтекста
Функция ПолучитьСсылкуЗапросом()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	СтавкиНДС.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.СтавкиНДС КАК СтавкиНДС
        |ГДЕ
        |	СтавкиНДС.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.СтавкиНДС.ПустаяСсылка();
    
КонецФункции

Почему нельзя искать по наименованию?

Важно помнить, что поиск элемента кодом типа Справочники.СтавкиНДС.НайтиПоНаименованию("Без НДС") считается плохим тоном в разработке на платформе 1С. Выясним основные риски:

Именно поэтому использование связи с перечислением через серверный вызов является золотым стандартом для решения этой задачи.

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

Мы выяснили, что напрямую на клиенте через ПредопределенноеЗначение получить ставку «Без НДС» в УНФ невозможно из-за отсутствия жестких предопределенных имен в конфигураторе. Правильный алгоритм действий всегда включает в себя обращение к серверу. Рекомендуется в первую очередь проверять наличие метода Справочники.СтавкиНДС.БезНДС() в модуле менеджера, так как это штатный механизм, поддерживаемый разработчиками системы.

← На главную