К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить текущие данные в 1С

Как получить текущие данные в 1С: текущая дата сеанса, актуальные остатки и цены, срез последних, запросы к регистрам. Примеры кода, SQL и типовые ошибки.

Фраза «текущие данные» в контексте 1С может означать три разные задачи: получить текущую дату и время сеанса, прочитать актуальные значения из регистров (остатки, цены, курсы валют) или выгрузить свежие сведения во внешнюю систему. У каждой задачи свой инструмент, и ошибка в выборе приводит либо к неверным цифрам в отчётах, либо к лишней нагрузке на базу.

Ниже разобраны рабочие способы для встроенного языка 1С, языка запросов и внешних интеграций. Примеры применимы к платформе 8.3 и типовым конфигурациям на управляемых формах, но принципы одинаковы и для самописных решений.

Как получить текущую дату и время в коде 1С

Основная функция — ТекущаяДатаСеанса(). Она возвращает дату и время компьютера, на котором выполняется код, с учётом часового пояса сеанса. В клиент-серверном режиме при вызове на сервере это время сервера приложений, при вызове на клиенте — время рабочей станции пользователя. Именно поэтому дату для записи в базу всегда берут на сервере: иначе документы от пользователей из разных часовых поясов получат несогласованные отметки времени.

Устаревшая функция ТекущаяДата() в управляемом приложении работает с ограничениями и на сервере может быть недоступна — в новых разработках её не используют. Для получения только даты без времени применяют конструкцию НачалоДня(ТекущаяДатаСеанса()), для границы конца дня — КонецДня(...).

bsl
&НаСервере
Функция ПолучитьТекущуюДату()
    ТекДата = ТекущаяДатаСеанса();
    ДатаБезВремени = НачалоДня(ТекДата);
    Возврат ТекДата;
КонецФункции

Частая потребность — универсальная дата в формате UTC для обмена с веб-сервисами. Её получают функцией УниверсальноеВремя(ТекущаяДатаСеанса()), которая пересчитывает локальное время в UTC. Разница между локальным и универсальным временем зависит от часового пояса сеанса, поэтому в распределённых системах договоритесь заранее, в каком формате передавать даты.

Актуальные остатки и обороты: виртуальные таблицы регистров

Когда нужны «текущие данные» в смысле актуальных учётных показателей — складских остатков, задолженности, резервов — работают с виртуальными таблицами регистров накопления. Таблица Остатки возвращает значения на указанный момент (или на текущий момент, если период не задан), таблица Обороты — движения за интервал.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки";
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить().Выгрузить();

Если период в виртуальной таблице не указан, платформа рассчитывает остатки на текущий момент, включая непроведённые на будущее движения не берутся — учитываются только проведённые документы. Для регистров с включёнными итогами выборка на текущую дату выполняется быстро, поскольку итоги хранятся предрасчитанными. Для дат в прошлом расчёт может занять заметное время на больших таблицах.

Текущие цены, курсы и статусы: срез последних

Сведения, которые меняются во времени (цены номенклатуры, курсы валют, кадровые данные сотрудников), хранятся в периодических регистрах сведений. Актуальное значение на текущий момент получают через виртуальную таблицу СрезПоследних. Зеркальная таблица СрезПервых возвращает самое раннее значение после указанной даты — она нужна реже, например для поиска первого назначения сотрудника.

bsl
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныСрез.Номенклатура КАК Номенклатура,
| ЦеныСрез.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены) КАК ЦеныСрез";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());

Параметр периода в срезе последних включает записи с датой меньше или равной указанной. Если курс валюты не заведён ни разу, в срезе такой валюты просто не будет строки — это нужно учитывать в коде, чтобы не получить пустое значение там, где ожидалось число. Проверяйте результат на пустоту через Результат.Пустой() или соединение с проверкой ЕСТЬNULL в запросе.

Как получить текущие данные из справочников и документов

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

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

Типичные ошибки
01
Чтение справочников в цикле через объектную модель вместо одного запроса — резкое падение производительности на больших выборках
02
Использование ТекущаяДата() на клиенте для записи в базу — разъезжающиеся отметки времени у пользователей из разных часовых поясов
03
Срез последних без проверки пустого результата — пустые цены и курсы молча попадают в расчёты
04
Получение остатков на прошлую дату без указания границы — запрос считается дольше и может вернуть неочевидный результат на границе документа

Получение текущих данных для внешних систем

Когда «текущие данные 1С» нужны внешнему приложению — сайту, мобильному клиенту, учётной системе — есть несколько штатных путей. HTTP-сервисы, опубликованные на веб-сервере, отдают данные по запросу в JSON или XML; OData-интерфейс позволяет читать объекты конфигурации стандартными HTTP-запросами без написания кода на стороне 1С; планы обмена подходят для регулярной синхронизации между базами.

Сравнение способов выгрузки текущих данных

HTTP-сервисы

Гибкий формат ответа и контроль логики, но требуют разработки и публикации на веб-сервере

OData

Быстрый доступ к данным без кода, но ограничен стандартными операциями и требует настройки прав

Планы обмена

Надёжная регулярная синхронизация между базами 1С, но не подходит для запросов «прямо сейчас» из произвольной системы

COM/внешнее соединение

Работает только в Windows-инфраструктуре и создаёт нагрузку на сеанс, для новых интеграций не рекомендуется

Для разовой ручной выгрузки актуальных данных достаточно встроенных средств: любой табличный документ или результат отчёта сохраняется в Excel или CSV, а универсальные обработки выгрузки позволяют отобрать данные по условиям. Это безопасный способ, не требующий изменения конфигурации.

Проверка результата и производительность

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

Контрольные точки

Как проверить результат

Дата в полученном значении
Норма

Совпадает с текущей датой сервера с учётом часового пояса

Тревожный признак

Смещение на несколько часов — код выполнен на клиенте в другом поясе

Остатки из запроса против штатного отчёта
Норма

Значения совпадают на один и тот же момент времени

Тревожный признак

Расхождения — проверьте параметры виртуальной таблицы и отборы

Срез последних по ценам
Норма

У каждой позиции есть строка с ценой и датой установки

Тревожный признак

Часть позиций отсутствует — цены для них не назначались

По производительности действуют простые правила: всегда задавайте отборы в параметрах виртуальной таблицы, а не в секции ГДЕ после неё — так фильтрация выполняется на уровне расчёта виртуальной таблицы. Не выбирайте поля «звёздочкой» из больших таблиц. Для часто запрашиваемых текущих данных в интеграциях рассмотрите кэширование на стороне приёмника с коротким временем жизни, чтобы не бомбардировать базу одинаковыми запросами.

Итог

Что важно запомнить

Дату берите через ТекущаяДатаСеанса() на сервере, остатки — через виртуальные таблицы регистров накопления, актуальные значения периодических сведений — через СрезПоследних, а для внешних систем используйте HTTP-сервисы или OData. Всегда проверяйте результат на пустоту и сверяйте выборки со штатными отчётами.

Частые вопросы

Чем ТекущаяДатаСеанса() отличается от ТекущаяДата()?

ТекущаяДатаСеанса() возвращает время с учётом часового пояса сеанса и корректно работает на сервере в управляемом приложении. ТекущаяДата() — устаревший вариант, в управляемом режиме её поведение ограничено, поэтому в новом коде используют только первую функцию.

Как получить остатки именно на текущий момент, а не на дату?

Не передавайте параметр периода в виртуальную таблицу Остатки — тогда платформа рассчитает значения на момент выполнения запроса. Если период всё же нужен, передайте в него ТекущаяДатаСеанса() как параметр запроса.

Почему срез последних вернул пустой результат?

Чаще всего в регистре просто нет записей, удовлетворяющих отбору, на указанную дату: цена не назначалась, курс не загружался. Проверьте наличие записей в регистре вручную и добавьте в код обработку пустого результата запроса.

Можно ли получить текущие данные 1С без программирования?

Да. Штатные отчёты конфигурации показывают актуальные остатки и сведения, результат можно сохранить в Excel или CSV. Для внешних систем без разработки подойдёт публикация OData, если она включена администратором.

Безопасно ли читать данные напрямую из SQL-базы?

Чтение в обход платформы не нарушит данные, но вы получите «сырые» физические таблицы без учёта итогов, виртуальных таблиц, разделителей и прав доступа — интерпретировать их сложно и рискованно. Для продуктивных задач используйте механизмы платформы, а прямой SQL оставьте для аналитических копий базы.

Как отдать текущие данные на сайт в реальном времени?

Создайте в конфигурации HTTP-сервис, который по запросу выполняет выборку нужных данных и возвращает их в JSON. Сервис публикуется на веб-сервере (IIS или Apache), сайт обращается к нему обычным HTTP-запросом. Учтите аутентификацию и ограничьте доступ по правам пользователя 1С.