() Боюсь, что нет. Исправил этот момент
Функция теперь выглядит следующим образом:
// Функция заполняет кэш исходных комплектующих указанного перечня спецификаций
//
// Параметры:
// КэшСпецификаций - Соответствие -
// <продолжение описания параметра>
// МассивСпецификаций - Массив, СписокЗначений - содержит в себе перечень Спецификаций,
// для которых необходимо получить исходные комплектующие
// ВключатьПустые - Булево - Определяет, необходимо ли фиксировать Спецификации без исходных комплектующих
//
// Возвращаемое значение:
// Массив - Массив спецификаций исходных комплектующих. Используется чтобы вызвать эту функцию повторно
//
Функция ПолучитьСоставСпецификаций(КэшСпецификаций, МассивСпецификаций, ВключатьПустые = Ложь) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка КАК СпецификацияПродукции,
| СпецИсходныеКомплектующие.НомерСтроки КАК НомерСтроки,
| ВЫРАЗИТЬ(СпецИсходныеКомплектующие.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
| ВЫРАЗИТЬ(СпецИсходныеКомплектующие.Номенклатура КАК Справочник.Номенклатура).ВидВоспроизводства КАК НоменклатураВидВоспроизводства,
| ВЫРАЗИТЬ(СпецИсходныеКомплектующие.Номенклатура КАК Справочник.Номенклатура).ВидНоменклатуры КАК НоменклатураВидНоменклатуры,
| ВЫРАЗИТЬ(СпецИсходныеКомплектующие.ХарактеристикаНоменклатуры КАК Справочник.ХарактеристикиНоменклатуры) КАК ХарактеристикаНоменклатуры,
| СпецИсходныеКомплектующие.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВЫБОР
| КОГДА СпецИсходныеКомплектующие.Номенклатура ССЫЛКА Справочник.Номенклатура
| И СпецИсходныеКомплектующие.ЕдиницаИзмерения <> ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА СпецИсходныеКомплектующие.Количество * СпецИсходныеКомплектующие.ЕдиницаИзмерения.Коэффициент / СпецИсходныеКомплектующие.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
| ИНАЧЕ СпецИсходныеКомплектующие.Количество
| КОНЕЦ КАК Количество,
| ВЫБОР
| КОГДА СпецИсходныеКомплектующие.Ссылка ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СпецификацияПустая
|ПОМЕСТИТЬ ВТИсходныеКомплектующиеСпц
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецИсходныеКомплектующие
| ПО СпецификацииНоменклатуры.Ссылка = СпецИсходныеКомплектующие.Ссылка
|ГДЕ
| СпецификацииНоменклатуры.Ссылка В(&МассивСпецификаций)
| И ВЫБОР
| КОГДА &ВключатьПустые
| ТОГДА ИСТИНА
| ИНАЧЕ НЕ СпецИсходныеКомплектующие.Ссылка ЕСТЬ NULL
| КОНЕЦ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫРАЗИТЬ(ВТИсходныеКомплектующиеСпц.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
| ВТИсходныеКомплектующиеСпц.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
|ПОМЕСТИТЬ ВТНоменклатураХарактеристики
|ИЗ
| ВТИсходныеКомплектующиеСпц КАК ВТИсходныеКомплектующиеСпц
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ОсновныеСпецификацииНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры КАК СпецификацияНоменклатуры,
| 3 КАК Приоритет
|ПОМЕСТИТЬ ВТСпецификации
|ИЗ
| ВТНоменклатураХарактеристики КАК ВТНоменклатураХарактеристики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(
| ,
| (Номенклатура, ХарактеристикаНоменклатуры) В
| (ВЫБРАТЬ
| Таблица.Номенклатура,
| Таблица.ХарактеристикаНоменклатуры
| ИЗ
| ВТНоменклатураХарактеристики КАК Таблица)) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
| ПО ВТНоменклатураХарактеристики.Номенклатура = ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура
| И ВТНоменклатураХарактеристики.ХарактеристикаНоменклатуры = ОсновныеСпецификацииНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура,
| ВТНоменклатураХарактеристики.ХарактеристикаНоменклатуры,
| ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры,
| 4
|ИЗ
| ВТНоменклатураХарактеристики КАК ВТНоменклатураХарактеристики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| Таблица.Номенклатура
| ИЗ
| ВТНоменклатураХарактеристики КАК Таблица)
| И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
| ПО ВТНоменклатураХарактеристики.Номенклатура = ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура,
| ВТНоменклатураХарактеристики.ХарактеристикаНоменклатуры,
| ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры,
| 5
|ИЗ
| ВТНоменклатураХарактеристики КАК ВТНоменклатураХарактеристики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| Таблица.Номенклатура
| ИЗ
| ВТНоменклатураХарактеристики КАК Таблица)) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
| ПО ВТНоменклатураХарактеристики.Номенклатура = ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТСпецификации.Номенклатура,
| ВТСпецификации.ХарактеристикаНоменклатуры,
| ВТСпецификации.СпецификацияНоменклатуры
|ПОМЕСТИТЬ ВТСпецификацииПоУмолчанию
|ИЗ
| ВТСпецификации КАК ВТСпецификации
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ВТСпецификации.Номенклатура КАК Номенклатура,
| ВТСпецификации.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| МИНИМУМ(ВТСпецификации.Приоритет) КАК Приоритет
| ИЗ
| ВТСпецификации КАК ВТСпецификации
|
| СГРУППИРОВАТЬ ПО
| ВТСпецификации.Номенклатура,
| ВТСпецификации.ХарактеристикаНоменклатуры) КАК МинимальныйПриоритет
| ПО ВТСпецификации.Номенклатура = МинимальныйПриоритет.Номенклатура
| И ВТСпецификации.ХарактеристикаНоменклатуры = МинимальныйПриоритет.ХарактеристикаНоменклатуры
| И ВТСпецификации.Приоритет = МинимальныйПриоритет.Приоритет
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТИсходныеКомплектующиеСпц.СпецификацияПродукции КАК СпецификацияПродукции,
| ВТИсходныеКомплектующиеСпц.НомерСтроки,
| ВТИсходныеКомплектующиеСпц.Номенклатура,
| ВТИсходныеКомплектующиеСпц.НоменклатураВидВоспроизводства,
| ВТИсходныеКомплектующиеСпц.НоменклатураВидНоменклатуры,
| ВТИсходныеКомплектующиеСпц.ХарактеристикаНоменклатуры,
| ВТИсходныеКомплектующиеСпц.ЕдиницаИзмерения,
| ВТИсходныеКомплектующиеСпц.Количество,
| ВТИсходныеКомплектующиеСпц.СпецификацияПустая,
| ВТСпецификацииПоУмолчанию.СпецификацияНоменклатуры,
| ВЫБОР
| КОГДА ВТИсходныеКомплектующиеСпц.СпецификацияПродукции = ВТСпецификацииПоУмолчанию.СпецификацияНоменклатуры
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЗацикливаниеСпецификации,
| ЕСТЬNULL(СпецВыходныеИзделия.ТочкаМаршрута.Подразделение, ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)) КАК ЦехИзготовитель,
| СпецВыходныеИзделия.ТочкаМаршрута КАК ТочкаМаршрута
|ИЗ
| ВТИсходныеКомплектующиеСпц КАК ВТИсходныеКомплектующиеСпц
| ЛЕВОЕ СОЕДИНЕНИЕ ВТСпецификацииПоУмолчанию КАК ВТСпецификацииПоУмолчанию
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецВыходныеИзделия
| ПО ВТСпецификацииПоУмолчанию.СпецификацияНоменклатуры = СпецВыходныеИзделия.Ссылка
| И ВТСпецификацииПоУмолчанию.Номенклатура = СпецВыходныеИзделия.Номенклатура
| ПО ВТИсходныеКомплектующиеСпц.Номенклатура = ВТСпецификацииПоУмолчанию.Номенклатура
| И ВТИсходныеКомплектующиеСпц.ХарактеристикаНоменклатуры = ВТСпецификацииПоУмолчанию.ХарактеристикаНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| ВТИсходныеКомплектующиеСпц.СпецификацияПродукции,
| ВТИсходныеКомплектующиеСпц.НомерСтроки
|ИТОГИ ПО
| СпецификацияПродукции";
// Устанавливаем параметры
Запрос.УстановитьПараметр("МассивСпецификаций", МассивСпецификаций);
Запрос.УстановитьПараметр("ВключатьПустые", ВключатьПустые);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаПоСпецификациям = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
// Создадим таблицу такую же как колонки выборки
СтруктураТаблицы = Новый ТаблицаЗначений;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Если Колонка.Имя = "СпецификацияПродукции" Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтруктураТаблицы.Колонки.Добавить(), Колонка);
КонецЦикла;
// Здесь будем хранить различные спецификации исходных комплектующих
СпецификацииИсходныхКомплектующих = Новый ТаблицаЗначений;
СпецификацииИсходныхКомплектующих.Колонки.Добавить("СпецификацияНоменклатуры");
// Пройдемся по спецификациям и добавим их в кэш
Пока ВыборкаПоСпецификациям.Следующий() Цикл
Выборка = ВыборкаПоСпецификациям.Выбрать();
ИсходныеКомплектующие = СтруктураТаблицы.СкопироватьКолонки();// Создаем Таблицу исходных комплетующих текущей специфиикации. Создаем НОВУЮ таблицу, это очень важно
Пока Выборка.Следующий() Цикл
// Спецификация пустая - прерываемся, чтобы таблица исходных комплектующих была пустой
Если Выборка.СпецификацияПустая Тогда
Прервать;
КонецЕсли;
НоваяСтрока = ИсходныеКомплектующие.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
// Если обнаружено зацикливание - очищаем Спецификацию, чтобы это не обрабатывалось
Если Выборка.ЗацикливаниеСпецификации Тогда
Сообщить("Обнаружено зацикливание спецификации на изделие " + Выборка.Номенклатура, СтатусСообщения.Важное);
НоваяСтрока.СпецификацияНоменклатуры = Справочники.СпецификацииНоменклатуры.ПустаяСсылка();
Продолжить;
КонецЕсли;
// Если спецификацию еще не получали - добавим в список
Если КэшСпецификаций.Получить(Выборка.СпецификацияНоменклатуры) = Неопределено Тогда
НоваяСтрока = СпецификацииИсходныхКомплектующих.Добавить();
НоваяСтрока.СпецификацияНоменклатуры = Выборка.СпецификацияНоменклатуры;
КонецЕсли;
КонецЦикла;
// Добавляем в кэш Спецификацию и еще исходные комплектующие в виде ТаблицыЗначений
КэшСпецификаций.Вставить(ВыборкаПоСпецификациям.СпецификацияПродукции, ИсходныеКомплектующие);
КонецЦикла;
СпецификацииИсходныхКомплектующих.Свернуть("СпецификацияНоменклатуры");
Возврат СпецификацииИсходныхКомплектующих.ВыгрузитьКолонку("СпецификацияНоменклатуры");
КонецФункции
Показать