Перейти к содержанию

Виртуальные реквизиты

ℹ️ Виртуальный реквизит — это дополнительное вычисляемое поле документа или справочника "1С:Предприятие", которому соответствует определенная формула. В формуле могут использоваться обращения к данным из регистров сведений или регистров накопления приложения "1С:Предприятие".

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

Пример виртуального реквизита: в Заказе поставщика — сумма, которую осталось оплатить по данному заказу. Такая сумма считается "на лету" как разность между общей суммой заказа и суммой по всем оплаченным счетам, привязанным к данному заказу. В данном случае использование виртуального реквизита позволит синхронизировать только заказы и не синхронизировать счета.

Для доступа к справочнику виртуальных реквизитов выберите в пользовательским режиме "1С:Предприятие" пункт меню "Все действия" (или "Операции" -- "Справочник") и выберите справочник "Виртуальные реквизиты ("Первая форма"):

На каждый тип объекта (справочник или документ) можно назначить свой набор виртуальных реквизитов. Все элементы группируются по типам объектов и обобщенное описание посылается в "Первую Форму" (аналогично происходит при выгрузке данных).

Для каждого виртуального реквизиты задаются значения:

  • Имя -- имя виртуального реквизита (по аналогии с именем реквизита в конфигураторе "1С:Предприятие"). Имя виртуального реквизита не должно совпадать с именами других виртуальных и реальных реквизитов, настроенных в том же справочнике.

  • Синоним -- имя виртуального реквизита (по аналогии с синонимом реквизита в конфигураторе "1С:Предприятие").

  • Тип -- тип реквизита, отправляемого в "Первую форму".

  • Алгоритм вычисления -- код на встроенном языке "1С:Предприятие" для получения значения реквизита. Результат вычисления этого кода заносится в переменную ЗначениеРеквизита.

  • Алгоритм записи -- код на встроенном языке "1С:Предприятие", выполняемый при получении значения данного реквизита из "Первой Формы" или при любом другом действии с данным реквизитом (например, записать данные в регистр).

ℹ️ Внимание: не рекомендуется использовать метод "ЗначениеЗаполнено" при вычислении виртуального реквизита, так как его наличие может вызвать ошибки при работе механизма обмена.

Примеры кода в полях "Алгоритм вычисления" и "Алгоритм записи"

Пример 1

Пусть имеется виртуальный реквизит для получения юридического адреса контрагента. Он привязан к типу объекта "Справочник.Контрагенты". Виртуальный реквизит имеет имя ЮрАдрес, синоним Юрид. адрес, тип "Строка".

Поле "Алгоритм вычислений" содержит код:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|        КонтактнаяИнформация.Представление
|ИЗ
|        РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
|        КонтактнаяИнформация.Объект = &Объект
|        И КонтактнаяИнформация.Тип = &Тип
|        И КонтактнаяИнформация.Вид = &Вид";

Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
Запрос.УстановитьПараметр("Объект", ОбъектДанных.Ссылка);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
  ЗначениеРеквизита = Выборка.Представление;
Иначе
  ЗначениеРеквизита = "";
КонецЕсли;

Поле "Алгоритм записи" содержит код:

НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Объект.Установить(ОбъектДанных.Ссылка);
НаборЗаписей.Отбор.Тип.Установить(Перечисления.ТипыКонтактнойИнформации.Адрес);
НаборЗаписей.Отбор.Вид.Установить(Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);

НоваяЗапись = НаборЗаписей.Добавить();

НоваяЗапись.Объект = ОбъектДанных.Ссылка;
НоваяЗапись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
НоваяЗапись.Представление = ЗначениеИз1Ф;

НаборЗаписей.Записать();

Пример 2

Пусть имеется виртуальный реквизит для получения статуса договора. Он привязан к типу объекта "Справочник.ПроектДоговора". Виртуальный реквизит имеет имя СтатусОбъекта, синоним Статус объекта, тип "Лукап", ссылается на справочник СтатусыОбъектов.

Поле "Алгоритм вычислений" содержит код:

ЗначениеРеквизита = "";

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    бит_СтатусыОбъектов.Объект КАК Объект,
|    бит_СтатусыОбъектов.Статус КАК Статус,
|    ВложенныйЗапрос.ДатаОплаты КАК ДатаОплаты,
|    ВложенныйЗапрос.СуммаОплаты КАК СуммаОплаты
|ИЗ
|    РегистрСведений.бит_СтатусыОбъектов КАК бит_СтатусыОбъектов
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|              МАКСИМУМ(бит_ПланируемыйРасходДенежныхСредствОбороты.Период) КАК ДатаОплаты,
|              бит_ПланируемыйРасходДенежныхСредствОбороты.ДокументПланирования.ДокументОснование КАК Заявка,
|              СУММА(бит_ПланируемыйРасходДенежныхСредствОбороты.СуммаРасход) КАК СуммаОплаты
|        ИЗ
|              РегистрНакопления.бит_ПланируемыйРасходДенежныхСредств.Обороты(, , Регистратор, ДокументПланирования.ДокументОснование = &СсылкаНаДокумент) КАК бит_ПланируемыйРасходДенежныхСредствОбороты
|        ГДЕ
|              бит_ПланируемыйРасходДенежныхСредствОбороты.Регистратор ССЫЛКА Документ.СписаниеБезналичныхДенежныхСредств
|
|        СГРУППИРОВАТЬ ПО
|              бит_ПланируемыйРасходДенежныхСредствОбороты.ДокументПланирования.ДокументОснование) КАК ВложенныйЗапрос
|        ПО (бит_СтатусыОбъектов.Объект = ВложенныйЗапрос.Заявка)
|ГДЕ
|    бит_СтатусыОбъектов.ВидСтатуса = ЗНАЧЕНИЕ(Перечисление.бит_ВидыСтатусовОбъектов.Статус)
|    И бит_СтатусыОбъектов.Объект = &СсылкаНаДокумент";

//Параметры запроса
Запрос.УстановитьПараметр("СсылкаНаДокумент",ОбъектДанных.Ссылка);
Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
  ЗначениеРеквизита = Результат.Статус;
КонецЕсли;

Поле "Алгоритм записи" содержит код:

МенеджерЗаписи = РегистрыСведений.бит_СтатусыОбъектов.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Объект = ОбъектДанных.Ссылка;
МенеджерЗаписи.ВидСтатуса = Перечисления.бит_ВидыСтатусовОбъектов.Статус;
МенеджерЗаписи.Статус = Справочники.бит_СтатусыОбъектов.ПолучитьСсылку(Новый УникальныйИдентификатор(ЗначениеИз1Ф));
МенеджерЗаписи.Пользователь = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.ДатаИзмененияСтатуса = ТекущаяДата();

МенеджерЗаписи.Записать();

Пример запроса для контроля данных, получаемых 1С из "Первой Формы":

Запрос позволяет получить из Журнала регистрации 1С запись со значением любой переменной. Это значение содержится в переменной ЗначениеИз1Ф. Запрос может быть добавлен в любое место кода.

ЗаписьЖурналаРегистрации("тест", УровеньЖурналаРегистрации.Ошибка,,"значение переменной: "+ЗначениеИз1Ф);

Виртуальные документы (отчёты)

Начиная с версии модуля 1С от 2026-04, доступен новый тип виртуальных реквизитов — виртуальные документы (отчёты). Они позволяют получать агрегированные данные из 1С: P&L, расчётные листки, остатки отпусков, ФОТ и другие бизнес-отчёты.

В справочнике rgВиртуальныеДокументы (Первая Форма) создаются элементы с видом Query — в отличие от стандартных виртуальных реквизитов (вид Attribute), Query-тип возвращает таблицу данных вместо скалярного значения.

Методы веб-сервиса для работы с виртуальными документами: - GetReportDefinition — получение структуры отчёта (колонки, типы данных) - ExecuteQuery — выполнение отчёта с параметрами, возврат DataTable

Требования к настройке в 1С: - Элемент справочника rgВиртуальныеДокументы с видом Query - Алгоритм вычисления — запрос на языке 1С, возвращающий таблицу - Синхронный возврат результата (без обратного синка)

Проверка правильности алгоритмов вычисления и записи

Для каждого типа объекта можно проверить правильность кодов в полях "Алгоритм вычисления" и "Алгоритм записи" для всех его виртуальных реквизитов. Выберите любой объект соответствующего типа в поле "Объект проверки" -- алгоритмы будут проверяться на данных этого объекта.

Для проверки правильности алгоритма вычислений нажмите кнопку Проверить алгоритмы вычисления:

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

Для проверки правильности алгоритма записи выберите значение проверки и нажмите кнопку Проверить алгоритмы записи:

Для выбранного объекта проверки для каждого виртуального реквизита будет произведена проверка алгоритма, и результат проверки будет выведен в новое окно:

ℹ️ Выполнение проверки записи выполняется в транзакции и после выполнения проверки записи транзакция откатывается, т.е. значения, на которых проведено тестирование, не сохраняются в базе.