Промпт: запрос на языке 1С
Запрос 1С:Предприятие по описанию задачи. Готовый промт на русском: скопируйте, подставьте свои данные и вставьте в GigaChat, YandexGPT, ChatGPT, Claude или Gemini.
Текст промпта
Что подставить в промт
| Поле | Пример |
|---|---|
| {config} | «Управление торговлей 11» |
| {task} | остатки товаров на складе «Основной» на дату с ценой закупки и суммой, только ненулевые |
Ответы нейросетей на этот промпт
Решение
Для получения остатков товаров на определённом складе с учётом цены закупки и суммы (с исключением нулевых остатков), используем виртуальную таблицу регистра накопления «ОстаткиИДоступностьТоваровНаСкладах».
Запрос на языке запросов 1С:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество,
ВЫБОР
КОГДА Остатки.ПустаяСтрока() ТОГДА 0
ИНАЧЕ ПОЛУЧИТЬЦЕНУПОКУПКИ(Остатки.Номенклатура)
КОНЕЦ КАК ЦенаЗакупки,
Остатки.КоличествоОстаток * ВЫБОР
КОГДА Остатки.ПустаяСтрока() ТОГДА 0
ИНАЧЕ ПОЛУЧИТЬЦЕНУПОКУПКИ(Остатки.Номенклатура)
КОНЕЦ КАК Сумма
ИЗ
РегистрНакопления.ОстаткиИДоступностьТоваровНаСкладах.Остатки(
&ДатаОтчета,
Склады = &Склад
) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток > 0
Параметры запроса:
&ДатаОтчета— дата, на которую нужно получить остаток товара (например, текущая дата).&Склад— ссылка на склад («Основной»).
Как использовать функцию ПОЛУЧИТЬЦЕНУПОКУПКИ()?
Эта функция должна получать последнюю закупочную цену товара на указанную дату или ранее. Пример реализации функции можно сделать так:
Функция ПолучитьЦенаЗакупки(Номенклатура, ДатаОтчета)
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
ТоварыПоСериямСредняяСтоимостьПоследняяСредняяСтоимость КАК СредняяСтоимость
ИЗ
РегистрНакопления.ТоварыПоСериям.СредняяСтоимость(&Дата, Номенклатура = &Номенклатура) КАК ТоварыПоСериям";
Запрос.УстановитьПараметр("Дата", ДатаОтчета);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса[0].СредняяСтоимость;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Таким образом, итоговый запрос будет корректно возвращать сумму исходя из средней стоимости последнего поступления.
Передача параметров в коде программы:
Перед выполнением запроса обязательно передайте необходимые значения параметров следующим образом:
// Подготовка параметров
МоиПараметры = Новый Структура;
МоиПараметры.Вставить("ДатаОтчета", ТекущаяДата());
МоиПараметры.Вставить("Склад", Справочники.Склады.НайтиПоНаименованию("Основной"));
// Выполнение запроса
Запрос = Новый Запрос;
Запрос.Текст = "<ТекстЗапроса>";
Запрос.УстановитьПараметры(МоиПараметры);
РезультатЗапроса = Запрос.Выполнить();
ТабДокумент = Новый ТабличныйДокумент;
РезультатЗапроса.Выгрузить(ТабДокумент);
ТабДокумент.Показать();
Или же можете сразу выводить результаты через систему компоновки данных (СКД):
// Создание схемы компоновки данных
СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
СхемаКомпоновки.Имя = "Остаты_на_складе";
СхемаКомпоновки.Описание = "Остатки товаров на основном складе";
// Установка источника данных
ИсточникДанных = СхемаКомпоновки.ДобавитьИсточникДанных("РегистрНакопления.ОстаткиИДоступностьТоваровНаСкладах");
// Настройка структуры результата
НаборДанных = ИсточникДанных.ДобавитьНаборДанных("Остатки");
НаборДанных.Запрос = <ТекстЗапроса>;
// Получение отчета
НастройкиКомпоновки = СхемаКомпоновки.СоздатьНастройку();
Отчет = Новый ОтчетСистемыКомпоновкиДанных;
Отчет.ИспользоватьСхемуКомпоновки(СхемаКомпоновки, НастройкиКомпоновки);
Отчет.Вывести();
Итоговое представление данных:
Результатом выполнения данного запроса станет таблица с такими колонками:
| Номенклатура | Склад | Кол-во | Цена закупки | Сумма |
|---|---|---|---|---|
| Товар №1 | Основной | 5 | 100 | 500 |
| Товар №2 | Основной | 10 | 75 | 750 |
Это обеспечит получение всех необходимых сведений по остаткам на выбранном складе с актуальной информацией о цене закупок и сумме остатков.
Ниже пример запроса для 1С:Предприятие 8.3 / УТ 11, который получает остатки товаров на складе «Основной» на указанную дату, подтягивает цену закупки из регистра цен и рассчитывает сумму.
Используются виртуальные таблицы:
РегистрНакопления.ТоварыНаСкладах.Остатки(...)РегистрСведений.ЦеныНоменклатуры.СрезПоследних(...)
Отбор по складу и виду цены передаётся в параметры виртуальных таблиц, а не в ГДЕ.
Запрос
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Характеристика КАК Характеристика,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество,
ЕСТЬNULL(Цены.Цена, 0) КАК ЦенаЗакупки,
Остатки.КоличествоОстаток * ЕСТЬNULL(Цены.Цена, 0) КАК СуммаЗакупки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаОстатков,
Склад = &Склад
) КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ДатаОстатков,
ВидЦены = &ВидЦеныЗакупки
) КАК Цены
ПО
Цены.Номенклатура = Остатки.Номенклатура
И Цены.Характеристика = Остатки.Характеристика
ГДЕ
Остатки.КоличествоОстаток <> 0
УПОРЯДОЧИТЬ ПО
Номенклатура,
Характеристика
Пояснения
Остатки
Используется виртуальная таблица:
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад)
Это правильно, потому что отбор по складу лучше передавать именно в параметры виртуальной таблицы. Так платформа рассчитает остатки только по нужному складу, а не сначала получит все остатки, а потом отфильтрует их в ГДЕ.
Цены
Цена закупки берётся из регистра сведений:
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ДатаОстатков,
ВидЦены = &ВидЦеныЗакупки
)
Здесь также отбор по виду цены передаётся в параметры виртуальной таблицы СрезПоследних.
Ненулевые остатки
Условие:
ГДЕ
Остатки.КоличествоОстаток <> 0
оставлено в секции ГДЕ, потому что это отбор уже по рассчитанному ресурсу виртуальной таблицы.
Как передать параметры в запрос
Пример серверного кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.КоличествоОстаток КАК Количество,
| ЕСТЬNULL(Цены.Цена, 0) КАК ЦенаЗакупки,
| Остатки.КоличествоОстаток * ЕСТЬNULL(Цены.Цена, 0) КАК СуммаЗакупки
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ДатаОстатков,
| Склад = &Склад
| ) КАК Остатки
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &ДатаОстатков,
| ВидЦены = &ВидЦеныЗакупки
| ) КАК Цены
| ПО
| Цены.Номенклатура = Остатки.Номенклатура
| И Цены.Характеристика = Остатки.Характеристика
|
|ГДЕ
| Остатки.КоличествоОстаток <> 0
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика";
ДатаОстатков = КонецДня(ДатаОтчета);
Склад = Справочники.Склады.НайтиПоНаименованию("Основной");
// Вариант 1 — если вид цены ищем по наименованию
ВидЦеныЗакупки = Справочники.ВидыЦен.НайтиПоНаименованию("Закупочная");
// Вариант 2 — если в вашей базе вид цены называется иначе
// ВидЦеныЗакупки = Справочники.ВидыЦен.НайтиПоНаименованию("Цена закупки");
Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ВидЦеныЗакупки", ВидЦеныЗакупки);
Результат = Запрос.Выполнить();
Вывод результата в табличный документ
Простой пример вывода без макета:
ТабДок = Новый ТабличныйДокумент;
Выборка = Результат.Выбрать();
Область = ТабДок.Область(1, 1, 1, 6);
ТабДок.Область(1, 1).Текст = "Номенклатура";
ТабДок.Область(1, 2).Текст = "Характеристика";
ТабДок.Область(1, 3).Текст = "Склад";
ТабДок.Область(1, 4).Текст = "Количество";
ТабДок.Область(1, 5).Текст = "Цена закупки";
ТабДок.Область(1, 6).Текст = "Сумма закупки";
НомерСтроки = 2;
Пока Выборка.Следующий() Цикл
ТабДок.Область(НомерСтроки, 1).Текст = Выборка.Номенклатура;
ТабДок.Область(НомерСтроки, 2).Текст = Выборка.Характеристика;
ТабДок.Область(НомерСтроки, 3).Текст = Выборка.Склад;
ТабДок.Область(НомерСтроки, 4).Текст = Выборка.Количество;
ТабДок.Область(НомерСтроки, 5).Текст = Выборка.ЦенаЗакупки;
ТабДок.Область(НомерСтроки, 6).Текст = Выборка.СуммаЗакупки;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Показать("Остатки товаров на складе Основной");
Вывод через СКД
Для СКД этот текст запроса можно использовать как набор данных Запрос.
Параметры СКД
В схеме компоновки данных нужно добавить параметры:
| Параметр | Тип |
|---|---|
ДатаОстатков | Дата |
Склад | СправочникСсылка.Склады |
ВидЦеныЗакупки | СправочникСсылка.ВидыЦен |
Поля набора данных
В наборе данных будут доступны поля:
НоменклатураХарактеристикаСкладКоличествоЦенаЗакупкиСуммаЗакупки
Настройки СКД
В настройках отчёта можно вывести группировки, например:
Склад
Номенклатура
Характеристика
Ресурсы:
КоличествоСуммаЗакупки
Для ЦенаЗакупки лучше не суммировать, а выводить как детальное поле или использовать агрегат Максимум, если нужно показать цену в строке группировки.
Важное замечание по УТ 11
В разных релизах УТ 11 состав измерений регистра ЦеныНоменклатуры может отличаться. Часто цена хранится не только по номенклатуре и характеристике, но и по упаковке. Если в вашей базе цены ведутся по упаковкам, может понадобиться добавить условие соединения или отбор по упаковке, например:
И Цены.Упаковка = &Упаковка
или использовать основную упаковку номенклатуры. Но базовый вариант для получения закупочной цены по номенклатуре и характеристике выглядит так, как в запросе выше.
Запрос: остатки товаров с ценой закупки (УТ 11)
Текст запроса
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК Характеристика,
ТоварыНаСкладахОстатки.Склад КАК Склад,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество,
ЦеныСрезПоследних.Цена КАК ЦенаЗакупки,
ЦеныСрезПоследних.Цена.Валюта КАК Валюта,
ТоварыНаСкладахОстатки.КоличествоОстаток * ЕСТЬNULL(ЦеныСрезПоследних.Цена, 0) КАК Сумма
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&Период,
Склад = &Склад) КАК ТоварыНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&Период,
ВидЦены = &ВидЦеныЗакупка) КАК ЦеныСрезПоследних
ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ЦеныСрезПоследних.ХарактеристикаНоменклатуры
ГДЕ
ТоварыНаСкладахОстатки.КоличествоОстаток <> 0
УПОРЯДОЧИТЬ ПО
Номенклатура
Почему именно так
- Отбор по складу и дате задан параметрами виртуальной таблицы
Остатки(&Период, Склад = &Склад)— СУБД сама построит оптимальный запрос с учётом итогов, это быстрее, чемГДЕ Склад = &Складпо развёрнутым движениям. - Аналогично вид цены и дата среза задаются в параметрах таблицы
СрезПоследних(&Период, ВидЦены = &ВидЦеныЗакупка). - Условие
КоличествоОстаток <> 0оставлено вГДЕ, т.к. это фильтр уже по результату агрегации, а не по измерениям регистра — здесь он применяется к столбцу, а не к виртуальной таблице, поэтому вынести его в параметры нельзя (виртуальная таблица остатков не фильтрует по значению ресурса).
Как передать параметры
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаВыше;
// Склад "Основной" — ищем ссылку по наименованию (один раз, лучше закэшировать)
Склад = Справочники.Склады.НайтиПоНаименованию("Основной", Истина);
// Вид цены "Закупочная" — аналогично
ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Закупочная", Истина);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ВидЦеныЗакупка", ВидЦены);
Запрос.УстановитьПараметр("Период", ТекущаяДата()); // или конкретная Дата/МоментВремени
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Важно: &Период — это дата, на которую нужны остатки и срез цен. Если нужна точность "в рамках документа" (учитывать движения этого же документа), передавайте не Дату, а ГраницаВключая(ТекущаяДата()) или МоментВремени() документа:
Запрос.УстановитьПараметр("Период", Граница.Создать(ГраницаВключая, ТекущаяДата()));
Вывод в табличный документ
ТабДок = Новый ТабличныйДокумент;
Макет = Новый ТабличныйДокумент; // можно просто вывести через ВывестиВТабличныйДокумент
ТабДок.Вывести(Выборка); // простой вариант — быстрый вывод выборки
// либо через макет с шапкой/подвалом
Пока Выборка.Следующий() Цикл
ОбластьСтроки = Макеты.ОсновнойМакет.ПолучитьОбласть("Строка");
ОбластьСтроки.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтроки);
КонецЦикла;
ТабДок.Показать(); // или ТабДок.Записать(...) для сохранения
Вывод через СКД (рекомендуемый способ в УТ 11)
- Создайте объект Схема компоновки данных в конфигурации или динамически через код (
ПостроительКомпоновкиДанных). - В качестве набора данных укажите этот же текст запроса.
- В схеме объявите параметры
Период,Склад,ВидЦеныЗакупка— для склада и вида цены сделайте доступным список значений (связь с соответствующим справочником), чтобы пользователь выбирал их в настройках, а не хардкодил. - Для параметра
Складможно задать значение по умолчанию = ссылка на "Основной", а в поле "Доступные значения" — ограничение. - Программно:
СхемаКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);
// Установка параметров
ПараметрПериод = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиПараметр(Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Значение = ТекущаяДата();
ПараметрПериод.Использование = Истина;
ПараметрСклад = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиПараметр(Новый ПараметрКомпоновкиДанных("Склад"));
ПараметрСклад.Значение = Склад;
ПараметрСклад.Использование = Истина;
ПараметрВидЦены = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиПараметр(Новый ПараметрКомпоновкиДанных("ВидЦеныЗакупка"));
ПараметрВидЦены.Значение = ВидЦены;
ПараметрВидЦены.Использование = Истина;
МакетКомпоновки = Новый МакетКомпоновкиДанных;
ПостроительМакета = Новый ПостроительМакетаКомпоновкиДанных;
МакетКомпоновки = ПостроительМакета.Выполнить(СхемаКД, КомпоновщикНастроек.ПолучитьНастройки());
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьТабличныйДокумент(ТабДок);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , Новый МенеджерКомпоновкиДанных);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Рекомендации по оформлению отчёта в СКД
- В группировке по строкам —
Номенклатура(+Характеристика, если используются). - В ресурсы вынесите
КоличествоиСуммас функцией "Сумма". - Добавьте условное оформление, скрывающее строки с нулевым количеством (хотя при правильном запросе их и так не будет).
- Включите отбор
Количество <> 0в самой СКД как дополнительную защиту, если отчёт потом будут модифицировать пользователи через настройки.
Отлично, коллега! Как программист 1С с опытом, я понимаю важность эффективных запросов. Вот решение вашей задачи для УТ 11.
Запрос на языке запросов 1С:Предприятие 8.3
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
ТоварыНаСкладахОстатки.Серия КАК Серия,
ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество,
ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаЗакупки,
ТоварыНаСкладахОстатки.ВНаличииОстаток * ЦеныНоменклатурыСрезПоследних.Цена КАК СуммаЗакупки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаСреза,
Склад = &СкладОсновной
И ВНаличииОстаток <> 0) КАК ТоварыНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ДатаСреза,
ВидЦены = &ВидЦеныЗакупки) КАК ЦеныНоменклатурыСрезПоследних
ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
ГДЕ
ЦеныНоменклатурыСрезПоследних.Цена ЕСТЬ НЕОПРЕДЕЛЕНО
ИЛИ ЦеныНоменклатурыСрезПоследних.Цена <> 0
Пояснение к запросу
ВЫБРАТЬ: Определяем поля, которые хотим получить:Номенклатура,Характеристика,Серия: Идентификация товара.Количество: Остаток товара на складе.ЦенаЗакупки: Цена закупки товара.СуммаЗакупки: Вычисляемое поле (Количество * ЦенаЗакупки).
ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаСреза, Склад = &СкладОсновной И ВНаличииОстаток <> 0):- Это ключевая часть. Мы используем виртуальную таблицу
Остаткирегистра накопленияТоварыНаСкладах. &ДатаСреза: Параметр для даты, на которую нужны остатки.Склад = &СкладОсновной: Параметр для отбора по конкретному складу. Это гораздо эффективнее, чем отбирать вГДЕ, так как СУБД сразу строит остатки только для нужного склада.ВНаличииОстаток <> 0: Отбор только ненулевых остатков прямо в виртуальной таблице. Это также оптимизация, так как СУБД не будет возвращать записи с нулевым количеством.
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ВидЦены = &ВидЦеныЗакупки):- Присоединяем виртуальную таблицу
СрезПоследнихрегистра сведенийЦеныНоменклатуры. Она позволяет получить последнюю актуальную цену на указанную дату. &ДатаСреза: Используем ту же дату, что и для остатков.ВидЦены = &ВидЦеныЗакупки: Параметр для отбора по конкретному виду цены. В УТ 11 виды цен хранятся в справочникеВидыЦенНоменклатуры.
ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика:- Условие соединения по номенклатуре и характеристике.
ГДЕ ЦеныНоменклатурыСрезПоследних.Цена ЕСТЬ НЕОПРЕДЕЛЕНО ИЛИ ЦеныНоменклатурыСрезПоследних.Цена <> 0:- Это дополнительное условие для того, чтобы исключить строки, где цена закупки равна нулю.
ЛЕВОЕ СОЕДИНЕНИЕможет вернутьNULL(ЕСТЬ НЕОПРЕДЕЛЕНО) для цены, если для товара нет цены закупки на указанную дату. Мы хотим видеть такие товары (с нулевой ценой), но исключить те, у которых цена явно 0. - Если вы хотите видеть товары без цены закупки (с пустым значением в колонке "ЦенаЗакупки"), то это условие можно убрать. В текущем виде оно покажет товары, у которых нет цены закупки (цена будет
NULL), но не покажет товары, у которых цена явно установлена как0. Если нужно исключить иNULL, и0, то условие будетЦеныНоменклатурыСрезПоследних.Цена <> 0.
Как передать параметры
Параметры передаются в объект Запрос перед его выполнением.
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
ТоварыНаСкладахОстатки.Серия КАК Серия,
ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество,
ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаЗакупки,
ТоварыНаСкладахОстатки.ВНаличииОстаток * ЦеныНоменклатурыСрезПоследних.Цена КАК СуммаЗакупки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаСреза,
Склад = &СкладОсновной
И ВНаличииОстаток <> 0) КАК ТоварыНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ДатаСреза,
ВидЦены = &ВидЦеныЗакупки) КАК ЦеныНоменклатурыСрезПоследних
ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
ГДЕ
ЦеныНоменклатурыСрезПоследних.Цена ЕСТЬ НЕОПРЕДЕЛЕНО
ИЛИ ЦеныНоменклатурыСрезПоследних.Цена <> 0
// Пример кода на встроенном языке 1С
// 1. Создаем объект Запрос
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
ТоварыНаСкладахОстатки.Серия КАК Серия,
ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество,
ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаЗакупки,
ТоварыНаСкладахОстатки.ВНаличииОстаток * ЦеныНоменклатурыСрезПоследних.Цена КАК СуммаЗакупки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаСреза,
Склад = &СкладОсновной
И ВНаличииОстаток <> 0) КАК ТоварыНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ДатаСреза,
ВидЦены = &ВидЦеныЗакупки) КАК ЦеныНоменклатурыСрезПоследних
ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
ГДЕ
ЦеныНоменклатурыСрезПоследних.Цена ЕСТЬ НЕОПРЕДЕЛЕНО
ИЛИ ЦеныНоменклатурыСрезПоследних.Цена <> 0
";
// 2. Устанавливаем значения параметров
Запрос.УстановитьПараметр("ДатаСреза", ТекущаяДата()); // Или любая другая дата, например, КонецДня(ТекущаяДата())
Запрос.УстановитьПараметр("СкладОсновной", Справочники.Склады.НайтиПоНаименованию("Основной")); // Предполагаем, что склад с таким наименованием существует
// Если склада нет или наименование другое, нужно получить его по GUID или другим способом
// Например: Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор("..."));
// Для вида цены "Закупочная"
// В УТ11 вид цены - это элемент справочника "ВидыЦенНоменклатуры".
// Нужно найти его по наименованию или другим способом.
// Например:
ВидЦеныЗакупки = Справочники.ВидыЦенНоменклатуры.НайтиПоНаименованию("Закупочная");
Если ВидЦеныЗакупки = Неопределено Тогда
// Обработка ситуации, если вид цены не найден
Сообщить("Вид цены 'Закупочная' не найден!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Запрос.УстановитьПараметр("ВидЦеныЗакупки", ВидЦеныЗакупки);
// 3. Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
// 4. Получаем выборку
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
// Теперь ВыборкаДетальныеЗаписи содержит нужные данные.
// Далее можно вывести их в табличный документ или использовать в СКД.
Как вывести результат в табличный документ или СКД
1. Вывод в Табличный Документ (простой вариант)
Этот способ подходит для быстрых отчетов или обработки данных в коде.
// Продолжение предыдущего примера
// Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить();
// Заголовок
ТабДок.ВывестиТекст("Остатки товаров на складе 'Основной' на " + Формат(Запрос.Параметры.ДатаСреза, "ДФ=dd.MM.yyyy HH:mm:ss"), , , , Истина);
ТабДок.ВывестиРазделительСтраниц();
// Шапка таблицы
ТабДок.НачатьСтроку();
ТабДок.ВывестиТекст("Номенклатура", , , , Истина);
ТабДок.ВывестиТекст("Характеристика", , , , Истина);
ТабДок.ВывестиТекст("Серия", , , , Истина);
ТабДок.ВывестиТекст("Количество", , , , Истина);
ТабДок.ВывестиТекст("Цена закупки", , , , Истина);
ТабДок.ВывестиТекст("Сумма закупки", , , , Истина);
ТабДок.ЗакончитьСтроку();
// Выводим данные
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ТабДок.НачатьСтроку();
ТабДок.ВывестиТекст(Строка(ВыборкаДетальныеЗаписи.Номенклатура));
ТабДок.ВывестиТекст(Строка(ВыборкаДетальныеЗаписи.Характеристика));
ТабДок.ВывестиТекст(Строка(ВыборкаДетальныеЗаписи.Серия));
ТабДок.ВывестиТекст(Формат(ВыборкаДетальныеЗаписи.Количество, "ЧЦ=15; ЧДЦ=3"));
ТабДок.ВывестиТекст(Формат(ВыборкаДетальныеЗаписи.ЦенаЗакупки, "ЧЦ=15; ЧДЦ=2"));
ТабДок.ВывестиТекст(Формат(ВыборкаДетальныеЗаписи.СуммаЗакупки, "ЧЦ=15; ЧДЦ=2"));
ТабДок.ЗакончитьСтроку();
КонецЦикла;
// Показываем табличный документ
ТабДок.Показать();
2. Вывод через Систему Компоновки Данных (СКД)
Это рекомендуемый способ для создания отчетов в 1С, так как он предоставляет гибкость настройки, группировки, отборы и вывод в различных форматах без написания большого объема кода.
- Создайте новый отчет (или обработку с формой и СКД) в конфигураторе.
- На вкладке "Наборы данных" добавьте новый набор данных - "Запрос".
- Скопируйте текст запроса в поле "Текст запроса".
- На вкладке "Параметры" СКД автоматически определит параметры
ДатаСреза,СкладОсновной,ВидЦеныЗакупки. - Для
ДатаСрезаустановитеТип значенияДата,ДоступностьИстина,ВыражениеКонецДня(&Период). Создайте пользовательский параметрПериодс типомДатаи режимом редактированияСтандартный интервал. - Для
СкладОсновнойустановитеТип значенияСправочникСсылка.Склады,ДоступностьИстина. - Для
ВидЦеныЗакупкиустановитеТип значенияСправочникСсылка.ВидыЦенНоменклатуры,ДоступностьИстина. - На вкладке "Поля" проверьте, что все поля определены корректно.
- На вкладке "Настройки" создайте новую настройку по умолчанию:
- Добавьте выбранные поля (
Номенклатура,Характеристика,Серия,Количество,ЦенаЗакупки,СуммаЗакупки). - Можете добавить группировки (например, по Номенклатуре).
- Настройте форматирование полей (например, числовые форматы для количества и цен).
- В форме отчета разместите элемент
ПолеКомпоновщикаНастроекКомпоновкиДанныхи свяжите его с вашей схемой СКД.
Пример настройки параметров в СКД:
- ДатаСреза:
- Тип значения:
Дата - Доступность:
Истина - Выражение:
КонецДня(&Период)(гдеПериод- это пользовательский параметр отчета) - СкладОсновной:
- Тип значения:
СправочникСсылка.Склады - Доступность:
Истина - Значение: Можно установить значение по умолчанию, например,
Справочники.Склады.НайтиПоНаименованию("Основной") - ВидЦеныЗакупки:
- Тип значения:
СправочникСсылка.ВидыЦенНоменклатуры - Доступность:
Истина - Значение: Можно установить значение по умолчанию, например,
Справочники.ВидыЦенНоменклатуры.НайтиПоНаименованию("Закупочная")
Этот подход с СКД даст вам полноценный, гибкий и удобный отчет, который пользователи смогут настраивать под свои нужды.
Советы
- Имена регистров и реквизитов проверьте в своей конфигурации: они отличаются между версиями.
- Скопируйте промпт кнопкой выше.
- Замените поля в фигурных скобках своими данными.
- Отправьте в нейросеть и сравните ответ с примером на этой странице.
Подробнее о структуре хорошего запроса: гид AI University.
Похожие промпты
Промпты работают лучше, когда понимаешь модель
56 официальных курсов Anthropic, OpenAI, Google и других на русском: первые уроки бесплатно, без VPN. Наборы промптов входят в полный доступ.