Здравствуйте. Наши креативщики не унимаются и желают видеть в макете документа ПеремещениеТовароа дополнительные столбцы с остатками по складам, якобы, чтобы можно было видеть остаток. Хотели видеть по всем складам, но уговорил только чтобы были остатки складов Отправитель и Получатель.
Сначала сделал через такой запрос (вернее два запроса для склада отправитель и склада получатель):
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровКомпанииОстатки.Номенклатура, | ОстаткиТоваровКомпанииОстатки.СкладКомпании, | ОстаткиТоваровКомпанииОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки |ГДЕ | ОстаткиТоваровКомпанииОстатки.Номенклатура = &Номенклатура | И ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпании";
Выборка = Запрос.Выполнить().Выбрать(); ОстатокНаСкладе = 0; Пока Выборка.Следующий() Цикл ОстатокНаСкладе = Выборка.КоличествоОстаток; КонецЦикла; ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе; .... // Тут выполняется второй запрос для склада получателя ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель; // Далее выводится строка в печатную форму
Работает, но долго, особенно если перемещение большое. Потом оптимизировал его до такого вида:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровКомпанииОстатки.Номенклатура, | ОстаткиТоваровКомпанииОстатки.СкладКомпании, | ОстаткиТоваровКомпанииОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки |ГДЕ | ОстаткиТоваровКомпанииОстатки.Номенклатура = &Номенклатура | И (ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпанииОтпр | ИЛИ ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпанииПолуч) | |СГРУППИРОВАТЬ ПО | ОстаткиТоваровКомпанииОстатки.СкладКомпании, | ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, | ОстаткиТоваровКомпанииОстатки.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать(); ОстатокНаСкладе = 0; Пока Выборка.Следующий() Цикл Если Выборка.СкладКомпании = ЭтотОбъект.СкладКомпании Тогда ОстатокНаСкладе = Выборка.КоличествоОстаток; ИначеЕсли Выборка.СкладКомпании = ЭтотОбъект.СкладПолучатель Тогда ОстатокПолучатель = Выборка.КоличествоОстаток; КонецЕсли; КонецЦикла; ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе; ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель; // Далее выводится строка в печатную форму
Время формирования печатной формы сократилось, но все-равно долго.
Подскажите пожалуйста, возможно-ли оптимизировать запрос еще, чтобы он не выполнялся каждый раз для каждой строки табличной части, а выполнился один раз для всего товара табличной части и двух складов, а разбор результата уже произвести в цикле? Можно-ли позиции табличной части поместить в список и передать этот список в запрос в качестве параметра или саму табличную часть передать как параметр?
... МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровКомпанииОстатки.Номенклатура, | ОстаткиТоваровКомпанииОстатки.СкладКомпании, | ОстаткиТоваровКомпанииОстатки.КоличествоОстаток |ПОМЕСТИТЬ ОстОтпрПолуч |ИЗ | РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки |ГДЕ | ОстаткиТоваровКомпанииОстатки.Номенклатура В(&СпНоменклатура) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстОтпрПолуч.Номенклатура, | ОстОтпрПолуч.СкладКомпании, | ОстОтпрПолуч.КоличествоОстаток |ИЗ | ОстОтпрПолуч КАК ОстОтпрПолуч |ГДЕ | ОстОтпрПолуч.СкладКомпании = &СкладОтпр | ИЛИ ОстОтпрПолуч.СкладКомпании = &СкладПолуч"; СпЗначений = ВыборкаТабличнойЧасти.Выгрузить(,"Номенклатура"); // Помещаем табл.часть в список Запрос.УстановитьПараметр("СпНоменклатура", СпЗначений); // Передаем список в качестве параметра Запрос.УстановитьПараметр("СкладОтпр", ЭтотОбъект.СкладКомпании); // Отбор по складу отправителю Запрос.УстановитьПараметр("СкладПолуч", ЭтотОбъект.СкладПолучатель);// и складу получателю ВыборкаОстатков = Запрос.Выполнить().Выбрать(); // Выгружаю в ТЗ результат выборки для дальнейшего поиска в цикле перебора ТЧ номенклатуры ВыбОст = Новый ТаблицаЗначений; ВыбОст.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура") ); ВыбОст.Колонки.Добавить("ОстатокСкладОтправитель", Новый ОписаниеТипов("Число") ); ВыбОст.Колонки.Добавить("ОстатокСкладПолучатель", Новый ОписаниеТипов("Число") ); ВыбОст.Очистить(); // Очищаем Табл.Знач. от мусора Пока ВыборкаОстатков.Следующий() Цикл НоваяСтрока = ВыбОст.Добавить(); НоваяСтрока.Номенклатура = ВыборкаОстатков.Номенклатура; Если ВыборкаОстатков.СкладКомпании = ЭтотОбъект.СкладКомпании Тогда НоваяСтрока.ОстатокСкладОтправитель = ВыборкаОстатков.КоличествоОстаток; НоваяСтрока.ОстатокСкладПолучатель = 0; ИначеЕсли ВыборкаОстатков.СкладКомпании = ЭтотОбъект.СкладПолучатель Тогда НоваяСтрока.ОстатокСкладОтправитель = 0; НоваяСтрока.ОстатокСкладПолучатель = ВыборкаОстатков.КоличествоОстаток; КонецЕсли; КонецЦикла; ВыбОст.Свернуть("Номенклатура","ОстатокСкладОтправитель, ОстатокСкладПолучатель"); // Перебираем табличную часть перемещения и формируем строки для вывода на печать Для Каждого СтрокаТабличнойЧасти Из ВыборкаТабличнойЧасти Цикл ... ОбластьТовар.Параметры.ТоварНаименование = СтрокаТабличнойЧасти.Номенклатура.Наименование; // Поиск текущего товара в ТЗ с остатками НайденаСтрока = ВыбОст.Найти(СтрокаТабличнойЧасти.Номенклатура, "Номенклатура"); ОстатокНаСкладе =0; ОстатокПолучатель=0; Если НайденаСтрока = Неопределено Тогда Сообщить("НЕ НАЙДЕНО"); Иначе ОстатокНаСкладе = НайденаСтрока.ОстатокСкладОтправитель; ОстатокПолучатель = НайденаСтрока.ОстатокСкладПолучатель; КонецЕсли; ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе; ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель; ... ТабличныйДокумент.Вывести(ОбластьТовар); КонецЦикла; МенеджерВременныхТаблиц.Закрыть(); // Удаление ВременнойТаблицы
Взял для сравнения Перемещение на 52 строки, нажал Печать и начал отсчет (без секундомера), так на вскидку 1, 2, 3 ... От момента нажатия Печать и до Появления печатной формы получилось: До оптимизации - 26 с или 0,5с/строку После оптимизации - 2 с или 0,038с/строку.
+ если в выборку добавить ИТОГИ - не надо будет сворачивать таблицу, а если колонки назвать так-же как Параметры, то не надо прописывать заполнение параметров по-отдельности.
sava1 @ Сегодня, 16:29 , А можете пояснить вот эту запись, а то не совсем понятно. Если с Номенклатура В (&СпНоменклатура) и СкладКомпании В (&СкладОтпр, &СкладПолуч) как бы понятно, то что означает запятая какой-то пустой параметр?
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки( | , | Номенклатура В (&СпНоменклатура) | И СкладКомпании В (&СкладОтпр, &СкладПолуч)) КАК ОстаткиТоваровКомпанииОстатки";
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!