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

Обработка проведения документа

Автор LehaAres, 21 мая 2011, 11:03

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

LehaAres

Добрый день. Я очередной чайник, прошу вашей помощи.
Есть документ "Приходный ордер". Надо сделать процедуру обработки его проведения так, чтобы при этом происходил поиск по некоторому условию в справочнике "Карточки складского учета" и выполнялась запись в табличную часть "Движения" элемента справочника, удовлетворяющего этому условию. Это возможно реализовать?
Пока что есть только автоматически сгенерированная процедура проведения по регистру накопления
ЦитироватьПроцедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   Движения.ОстаткиМатериалов.Записывать = Истина;
   Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
      // регистр ОстаткиМатериалов Приход
      Движение = Движения.ОстаткиМатериалов.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
      Движение.Период = Дата;
      Движение.IRA = ТекСтрокаМатериалы.IRA;
      Движение.KPA = KPA;
      Движение.MPR1 = ТекСтрокаМатериалы.MPR1;
   КонецЦикла;
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Думаю её допиливать, но не знаю тонкостей языка программирования (совсем), в частности как заставить её искать в нужном справочнике? Мои мысли, вероятно полный бред, с комментариями:
ЦитироватьПроцедура ОбработкаДвижений(Отказ, Режим)
   СправочникСсылка.KARTAZ.Движения.Записывать = Истина;    //разрешение записывать в нужный справочник
   Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

      
      Движение = Движения.ОстаткиМатериалов.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
      Движение.Период = Дата;
      Движение.IRA = ТекСтрокаМатериалы.IRA;
      Движение.KPA = KPA;
      Движение.MPR1 = ТекСтрокаМатериалы.MPR1;
   КонецЦикла;
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

LehaAres

Простите, тема случайно отправилась на полуслове, последнюю цитату не обрабатывайте.

ЦитироватьПроцедура ОбработкаДвижений(Отказ, Режим)
   Справочник.KARTAZ.Движения.Записывать = Истина;    //разрешение записывать в нужный справочник
   Для Каждого ТекСтрокаМатериалы Из Материалы Цикл           //перебираем строчки табличной части приходного ордера
      Для Каждого Элемент Из Справочник.KARTAZ Цикл         //перебираем элементы справочника "Карточки" в поисках подходящего
      Если KARTAZ.KMA = ТекСтрокаМатериалы.IRA                //если наименование товара из Ордера совпадает с наименованием из Карточки
      .....  // здесь должен быть код выполняющий запись в табличную часть карточки по некоторым реквизитам Приходного Ордера
      КонецЦикла;
      КонецЦикла;
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

LehaAres

Так наверное будет более грамотно? Только ещё не нашёл, как правильно указать на нужные реквизиты Документа для записи их значений в справочник.
ЦитироватьПроцедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   Движения.ОстаткиМатериалов.Записывать = Истина;
   Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
      СпрКарт = Справочники.KARTAZ
      СправочникВыборка = СпрКарт.НайтиПоРеквизиту("KMA",ТекСтрокаМатериалы.IRA);
      НовыйЭлемент = СпрКарт.ТабличнаяЧасть.СоздатьЭлемент();
      НовыйЭлемент.НомерДокумента = Документ.ПриходныйОрдер.НомерДокумента  // Как здесь правильно сказать?
      НовыйЭлемент.ТипДокумента =
      НовыйЭлемент.Поставщик =    
      НовыйЭлемент.Количество =
      НовыйЭлемент.Остаток =
      НовыйЭлемент.Дата =
   КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

cska-fanat-kz

по какому именно условию ищете в справочнике Карточки...?

1. По коду
НайденнаяКарточка = Справочники.Карточки.НайтиПоКоду(КодДляПоиска);
Если НайденнаяКарточка = Справочники.Карточки.ПустаяСсылка() Тогда
       //Карточка нет и можно создать новую
КонецЕсли;
2. По наименованию
НайденнаяКарточка = Справочники.Карточки.НайтиПоНаименованию(НаименованиеДляПоиска);
//Далее то же самое
3. По реквизиту
НайденнаяКарточка = Справочники.Карточки.НайтиПоРеквизиту("<<НазваниеРеквизита>>",РеквизитДляПоиска);
//Далее то же самое
Там еще у реквизита вроде должно быть включено индексирование...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

LehaAres

Цитата: cska-fanat-kz от 21 мая 2011, 13:15
по какому именно условию ищете в справочнике Карточки...?

В табличной части Документа перечисляются наименования товаров. Для каждого наименования существует отдельная карточка. Вот её надо найти и произвести туда запись о движениях товара, созданных Документом. Это я вроде написал в строчке
СправочникВыборка = СпрКарт.НайтиПоРеквизиту("KMA",ТекСтрокаМатериалы.IRA);
Здесь KMA -реквизит в справочнике, IRA - реквизит в Документе. Оба означают "наименование" товара.

И подскажите пожалуйста, как правильно оформить передачу данных из реквизитов Документа в табличную часть справочника (выше в цитате пустые строчки)?

cska-fanat-kz

Просто у справочника реквизит "Наименование" - стандартный, поиск по нему в п.2.
Но иногда заводят реквизит. Поиск по нему - п.3.

В цикле Для каждого... в ТекСтрокаМатериалы "хранятся" значения колонок текущей строки:

Для каждого ТекСтрокаМатериалы Из Материалы Цикл
НайденнаяКарточка = Справочники.Карточки.НайтиПоРеквизиту("КМА", ТекСтрокаМатериалы.IRA);
Если НайденнаяКарточка = Справочники.Карточки.ПустаяСсылка() Тогда
//Создать новую карточку
//или
Иначе
спрОбъект = НайденнаяКарточка.ПолучитьОбъект();
НоваяСтрока = спрОбъект.ТЧ.Добавить();
НоваяСтрока.НомерПриходника = Номер;
НоваяСтрока.ТипДокумента = "ПриходныйОрдер";
НоваяСтрока.Поставщик = Поставщик; //реквизит шапки
НоваяСтрока.Количество = ; //Количество чего?
...
спрОбъект.Записать();
КонецЕсли;

КонецЦикла;
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Шурыгин Иван Сергеевич

Цитата: cska-fanat-kz от 21 мая 2011, 17:22
Просто у справочника реквизит "Наименование" - стандартный, поиск по нему в п.2.
Но иногда заводят реквизит. Поиск по нему - п.3.

В цикле Для каждого... в ТекСтрокаМатериалы "хранятся" значения колонок текущей строки:

Для каждого ТекСтрокаМатериалы Из Материалы Цикл
НайденнаяКарточка = Справочники.Карточки.НайтиПоРеквизиту("КМА", ТекСтрокаМатериалы.IRA);
Если НайденнаяКарточка = Справочники.Карточки.ПустаяСсылка() Тогда
//Создать новую карточку
//или
Иначе
спрОбъект = НайденнаяКарточка.ПолучитьОбъект();
НоваяСтрока = спрОбъект.ТЧ.Добавить();
НоваяСтрока.НомерПриходника = Номер;
НоваяСтрока.ТипДокумента = "ПриходныйОрдер";
НоваяСтрока.Поставщик = Поставщик; //реквизит шапки
НоваяСтрока.Количество = ; //Количество чего?
...
спрОбъект.Записать();
КонецЕсли;

КонецЦикла;


возникает опять вопрос, целесобразности использования в принципе такого поведения программы.

документ краене редко должен сам изменять, или упаси боже, создавать новые элементы справочника. то делается либо справочником, либо обработками(и то обработками не самый лучший подход, чисто тематически)

все необходимые данные рекомендую записывать в регистр сведений, а справочник оставить в покое)
===================================
жизнь надо прожить так, чтоб вверху посмотрели.
и сказали "А ну ка повтори"
===================================

LehaAres

Цитироватьвозникает опять вопрос, целесобразности использования в принципе такого поведения программы.
*глубоко вздохнув* Согласен, подход видимо топорный, но я совсем плохо разбираюсь в предмете, чтобы четко знать как лучше сделать.

Была мысль, что лучше вырулить через регистры, но тут терзают проблемы, и я не знаю пути решения:
Движения документов обязательно надо расписать отдельно для каждого товара (как я понял - это какая-то статистика движения товара), но товаров over9000, для каждого ведь не будешь делать регистр, а как тогда? Можно ли прикрутить к регистру фильтр, что-то вроде выпадающего списка товаров, где выбрал нужное и отобразилось только то, что относится к данному товару? Если можно, ткните носом где прочитать об этом.

Шурыгин Иван Сергеевич

Цитата: LehaAres от 23 мая 2011, 14:15

Была мысль, что лучше вырулить через регистры, но тут терзают проблемы, и я не знаю пути решения:
Движения документов обязательно надо расписать отдельно для каждого товара (как я понял - это какая-то статистика движения товара), но товаров over9000, для каждого ведь не будешь делать регистр, а как тогда? Можно ли прикрутить к регистру фильтр, что-то вроде выпадающего списка товаров, где выбрал нужное и отобразилось только то, что относится к данному товару? Если можно, ткните носом где прочитать об этом.

создайте регистр сведений и в нем измерение товар. тогда можно будет фильтровать по товару. и делать срезы последних по измерению товар.

а если я не правильно понял, то может прямо на примере конкретно подскажите какова задача
===================================
жизнь надо прожить так, чтоб вверху посмотрели.
и сказали "А ну ка повтори"
===================================

LehaAres

Цитата: Шурыгин Иван Сергеевич от 24 мая 2011, 05:49
создайте регистр сведений и в нем измерение товар. тогда можно будет фильтровать по товару. и делать срезы последних по измерению товар.

Долго листал учебник Радченко, уже почти отчаялся найти в нем что-то полезное по нужному вопросу, и тут обнаружил что раздел "периодические регистры" как раз о регистрах сведений, а по описанию там самое то, что нужно для решения задачи. С тоской понял, сколько времени ухлопал зря, занимаясь ерундой от того, что вовремя не нашёл этот раздел... :(

Теги:

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

Рейтинг@Mail.ru

Поиск