Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
31 мая 2025, 11:23

как правильно сделать такой цикл?

Автор lakykherson, 02 фев 2023, 13:53

0 Пользователей и 1 гость просматривают эту тему.

lakykherson

Помогите пожалуйста дальше, теперь у меня есть две таблицы
первая что мы сейчас сделали под названием "Тест" я ее немного переделал теперь она содержит только два столбика
Номенклатура и КлючСвязи

И есть вторая таблица под наименованием "СерийныеНомераТАБ" которая имеет тоже два столбика
СерийныйНомер и КлючСвязи

как мне теперь из этих двух таблиц получить новую которая будет сделана на основе этих таблиц но иметь такие столбики


НомерСтроки , Номенклатура , СерийныйНомер

Должно быть такое правило объединения таблиц, берется первая строка таблицы "Тест" Из нее берется значение столбика "Номенклатура" и по ключу связи в таблице "СерийныеНомераТАБ" подбирается "СерийныйНомер"  это записывается в новую таблицу "Готово", и так по всему списку таблицы "Тест"
Но еще есть особенность если У Номенклатура нет серийного номера то подставляется значение "Серийный номер не заполнялся".

Пример таблиц в скриншоте прикрепил.

Там в позиции ГАЗ 33023 комби вообще нет серийников. а в поззиции ГАЗ 33023 комби удлиненные товаров 3шт а серийников всего 2шт.

Конечная таблица должна иметь вид

1 Автоэмаль белая SN111111 
2 ГАЗ 3302 SN22222             
3 ГАЗ 3302 DF222222           
4 ГАЗ 33023 комби Серийный номер не заполнялся
5 ГАЗ 33023 комби удлиненные SGR4444444444 
6 ГАЗ 33023 комби удлиненные SGR4444444442           
7 ГАЗ 33023 комби удлиненные Серийный номер не заполнялся


Вроде объяснил что я хотел получить, надеюсь получилось понято


 

Afinogen

я бы в таблице СерийныеНомераТАБ добавил еще колонку - флаг "Отобрано"  с типом "Булево"

И тогда б ваш алгоритм был такой

1. изначально бы имели 2 таблицы,  в таблице СерийныеНомераТАБ в колонке Отобрано были бы ложь
2
Для Каждого Стр из Тест Цикл

НоваяСтрока = ТаблицаИтог.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;

СтруктураПоиска = Новый Структура("КлючСвязи,Отобрано", Стр.КлючСвязи, Ложь);

НайденныеСтроки = СерийныеНомераТАБ.НайтиСтроки(СтруктураПоиска);

Если НайденныеСтроки.Количество()>0 Тогда

НоваяСтрока.СерийныйНомер = НайденныеСтроки[0].СерийныйНомер;
НайденныеСтроки[0].Отобрано = Истина;

Иначе
НоваяСтрока.СерийныйНомер = "Серийный номер не заполнялся"
КонецЕсли;

КонецЦикла



Afinogen

в общем идея в таблице СерийныеНомераТАБ  добавить некий флаг который изначально был бы у всех серийныз одинаковым а потмо как только серийник выбран  в новую  таблицу менялся

lakykherson

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

Максим75

lakykherson, ну не в одном, а в цикле еще запрос. за это вообще то ата-та надо делать.
таблицу значений один раз сделал, а здесь в каждой итерации цикла еще один запрос делается. 1С так очень не рекомендует так делать.
поэтому такое могут и не принять, если было задание такое.

Теги: 1с8 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск