8.х Обработка "ПодборНоменклатуры"

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем BigAnn, 18 апр 2012.

  1. TopicStarter Overlay
    BigAnn
    Offline

    BigAnn Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    26
    Доброго всем дня!
    У меня конфигурация "Комплексная автоматизация" 1.1
    Появилась необходимость внести изменения в обработку подбора номенклатуры. Конфигурацию ломать не хочу, решила сделать внешней обработкой заполнения табличных частей. А т.к. опыта в программировании на 8.2 очень и очень мало, надеюсь на вашу помощь.
    В общем, нужно правильно прописать процедуру инициализации. Я никак не могу понять, что туда нужно прописывать.
    Сейчас я из встроенной обработки просто сделала внешнюю.
    Документ - реквизит с типом ДокументСсылка.
    Сейчас у меня вот так, но выдает ошибку:

    Не верный тип параметра "СтруктураПараметровФормы"!
    Данная обработка вызывается из других процедур конфигурации.
    Вручную ее вызывать запрещено.

    Код:
    Процедура Инициализировать (Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
    ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];
    Документ = Объект; 
    ОсновнаяФорма = ПолучитьФорму("ОсновнаяФорма");
    ОсновнаяФорма.Открыть();
    
    КонецПроцедуры
    
    Спасибо!
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    BigAnn, сделать то что вы хотите возможно.

    Но просто, судя по вашему вопросу, на данный момент у вас не хватит на это знаний.
  3. TopicStarter Overlay
    BigAnn
    Offline

    BigAnn Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    26
    А подсказать можете, в какую сторону копать? Попробую разобраться. Откуда-то надо ведь опыт приобретать.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Там все чуть сложнее чем просто открытие формы подбора.
    В документе посмотрите как в организован вызов этой формы подбора. Зайдите прям в процедуру по кнопке Подбор() и посмотрите как он открывается.
    Надо будет перенести во внешнюю обработку процедуру формы документа ДействиеПодбор(), а так же аналог процедуры общего модуля РаботаСДиалогами.ОткрытьПодборНоменклатуры(). Естественно просто скопировать и вставить их во внешнюю обработку не получится, они не заработают, надо будет частично переписывать.

    Возьмите, не уверен что 100% рабочее, взял из промежуточной версии.


    Код:
    Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
    
    Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
    ДействиеПодборРеализацияТоваровУслуг(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта);
    // ИначеЕсли ТипЗнч(Объект) = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
    //  ДействиеПодборЗаказПокупателя(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта);
    Иначе
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    
    
    
    // Универсальная процедура, которая инициирует механизм подбора
    // номенклатуры в документы (открывает основную форму обработки подбор).
    //
    // Параметры:
    //  ФормаДокумента - форма документа, в который осуществляется подбор,
    //  СтруктураПараметров - параметры, которые передаются в форму подбора.
    //
    Процедура ОткрытьПодборНоменклатуры(ФормаДокумента, СтруктураПараметров, Метаданные, ФормаПодбора = Неопределено)
    
    МетаданныеДокумента = Метаданные;
    
    Для Каждого ЭлементСтруктурыПараметров Из СтруктураПараметров Цикл
    ИмяРеквизита = ЭлементСтруктурыПараметров.Ключ;
    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
    ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, "ОбновитьФормуПодбора", Ложь);
    Иначе
    Если ИмяРеквизита = "Склад" Тогда
    ИмяРеквизита = "СкладОрдер";
    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
    ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, "ОбновитьФормуПодбора", Ложь);
    Продолжить;
    КонецЕсли;
    ИмяРеквизита = "СкладОтправитель";
    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
    ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, "ОбновитьФормуПодбора", Ложь);
    Продолжить;
    КонецЕсли;
    ИмяРеквизита = "СкладГруппа";
    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
    ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, "ОбновитьФормуПодбора", Ложь);
    Продолжить;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    // Открываем форму подбора.
    ФормаПодбора = ПолучитьФорму("ОсновнаяФорма", ФормаДокумента, ФормаДокумента);
    СтруктураИсходныхПараметров = СтруктураПараметров;
    ФормаПодбора.Открыть();
    КонецПроцедуры // ОткрытьПодборНоменклатуры()
    
    
    
    //////////////////////////////////////////////////////////////
    //Для документа РеализацияТоваровУслуг
    //
    // Функция получает качество для подстановки значения качества при построчном вводе в табличную часть "Товары"
    // или при подборе номенклатуры с помощью обработки "Подбор номенклатуры" или обработки ввод серийных номеров
    // Рассчитывает качество только для вида операции "Брак", для других случаев качество по умолчанию новое.
    //
    // Параметры:
    // Качество				  - СправочникСсылка.Качество, необязательный параметр, если параметр заполнен он же возвращается,
    //							 ситуация возможна при варианте подбора через обработку подбор номенклатуры или обработку ввода серийных номеров.
    //
    // Возвращаемое значение:
    // СправочникСсылка.Качество - для вида операции "Брак" возвращается качество отличное от Нового и если количество таких элементов равное одному,
    //							 в остальных случаях пустая ссылка справочника качество.
    //						   - для остальных видов операций качество по умолчанию новое.
    //
    Функция ПолучитьКачествоНоменклатуры(Качество = Неопределено, Объект)
    Перем Результат;
    Если ЗначениеЗаполнено(Качество) Тогда
    возврат Качество;
    КонецЕсли;
    Если НЕ Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Брак Тогда
    // Для отличного вида операции от Брак, качество новое.
    возврат Справочники.Качество.Новый;
    КонецЕсли;
    Если НЕ мКачество = Неопределено Тогда
    возврат мКачество;
    КонецЕсли;
    Результат = Справочники.Качество.ПустаяСсылка();
    Запрос = Новый Запрос();
    Запрос.Текст = "
    |ВЫБРАТЬ
    | Качество.Ссылка КАК Качество
    |ИЗ
    | Справочник.Качество КАК Качество
    |ГДЕ
    | НЕ Качество.Ссылка = ЗНАЧЕНИЕ(Справочник.Качество.Новый)
    |";
    таблицаКачество = Запрос.Выполнить().Выгрузить();
    Если таблицаКачество.Количество() = 1 Тогда
    Результат = таблицаКачество[0]["Качество"];
    КонецЕсли;
    мКачество = Результат;
    Возврат Результат;
    КонецФункции // ПолучитьКачествоНоменклатуры()
    
    
    // Функция формирует список запросов для передачи в форму подбора.
    //
    // Параметры:
    //  ТабличнаяЧасть - табличная часть, для подбора в которую формируется список запросов.
    //
    // Возвращаемое значение:
    //  Список значений - список запросов.
    //
    Функция СформироватьСписокЗапросовДляПодбораРеализацияТоваровУслуг(ТабличнаяЧасть, Объект)
    МетаданныеОбъекта = Объект.Метаданные();
    СписокЗапросов = Новый СписокЗначений();
    СписокЗапросов.Добавить(,"По справочнику");
    ПустойТипЦен = НЕ ЗначениеЗаполнено(Объект.ТипЦен);
    Если ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["Товары"]
    ИЛИ ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["ВозвратнаяТара"] Тогда
    Если НЕ ПустойТипЦен ИЛИ (ЗначениеЗаполнено(Объект.ДоговорКонтрагента) И Объект.ДоговорКонтрагента.ВидУсловийДоговора = Перечисления.ВидыУсловийДоговоровВзаиморасчетов.СДополнительнымиУсловиями) Тогда
    СписокЗапросов.Добавить("РасходЦеныНоменклатуры", "По ценам номенклатуры");
    СписокЗапросов.Добавить("РасходОстаткиИЦеныНоменклатуры", "По остаткам и ценам номенклатуры");
    КонецЕсли;
    СписокЗапросов.Добавить("ОстаткиНоменклатуры", "По остаткам номенклатуры");
    ИначеЕсли ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["Услуги"] Тогда
    СписокЗапросов.Добавить("РасходУслуги",		"По услугам предприятия");
    Если НЕ ПустойТипЦен ИЛИ (ЗначениеЗаполнено(Объект.ДоговорКонтрагента) И Объект.ДоговорКонтрагента.ВидУсловийДоговора = Перечисления.ВидыУсловийДоговоровВзаиморасчетов.СДополнительнымиУсловиями) Тогда
    СписокЗапросов.Добавить("РасходЦеныУслуг", "По ценам и услугам предприятия");
    КонецЕсли;
    КонецЕсли;
    Возврат СписокЗапросов;
    КонецФункции // СформироватьСписокЗапросовДляПодбора()
    
    
    Процедура ДействиеПодборРеализацияТоваровУслуг(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта)
    Перем Команда, Валюта;
    
    мМожноМенятьЦенуВДокументе = УправлениеДопПравамиПользователей.РазрешитьРедактированиеЦенВДокументах();
    
    МетаданныеОбъекта = Объект.Метаданные();
    ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти.Найти(ИмяТабличнойЧасти);
    Если ТабличнаяЧасть = Неопределено Тогда
    Возврат;
    КонецЕсли;
    
    РазворачиватьДоКачества = Ложь;
    ЕстьЦена				= мМожноМенятьЦенуВДокументе;
    ЕстьСерия			   = Истина;
    Валюта				  = Объект.ВалютаДокумента;
    СпособЗаполненияЦен	 = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
    Качество				= ?(Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия, Справочники.Качество.Новый, Неопределено);
    ПодбиратьУслуги		 = Ложь;
    СкрыватьХарактеристику  = Ложь;
    
    ЕстьСкладВТабличнойЧасти = Объект.мУказаниеСкладовВТЧ;
    Если ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["Товары"] Тогда
    Команда				  = "ПодборВТабличнуюЧастьТовары";
    ИмяТабличнойЧасти		= "Товары";
    РазворачиватьДоКачества  = Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Брак;
    ИначеЕсли ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["ВозвратнаяТара"] Тогда
    Команда				  = "ПодборВТабличнуюЧастьВозвратнаяТара";
    ЕстьСерия				= Ложь;
    ИмяТабличнойЧасти		= "Тара";
    ИначеЕсли ТабличнаяЧасть = МетаданныеОбъекта.ТабличныеЧасти["Услуги"] Тогда
    Команда				  = "ПодборВТабличнуюЧастьУслуги";
    ЕстьСерия				= Ложь;
    ИмяТабличнойЧасти		= "Услуги";
    Качество				 = Неопределено;
    ЕстьСкладВТабличнойЧасти = Ложь;
    ПодбиратьУслуги		  = Истина;
    СкрыватьХарактеристику   = Истина;
    КонецЕсли;
    СписокВидовПодбора = СформироватьСписокЗапросовДляПодбораРеализацияТоваровУслуг(ТабличнаяЧасть, Объект);
    ПредставлениеДок   = МетаданныеОбъекта.Представление();
    СтруктураПараметровПодбора = Новый Структура();
    СтруктураПараметровПодбора.Вставить("Команда"				, Команда);
    СтруктураПараметровПодбора.Вставить("СписокВидовПодбора"	 , СписокВидовПодбора);
    // Параметры запросов.
    ВременнаяДатаРасчетов = ?(НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДата()), Неопределено, Объект.Дата);
    СтруктураПараметровПодбора.Вставить("ДатаРасчетов"			, ВременнаяДатаРасчетов);
    СтруктураПараметровПодбора.Вставить("КачествоПоУмолчанию"	 , ПолучитьКачествоНоменклатуры(,Объект));
    СтруктураПараметровПодбора.Вставить("Склад"				   , Объект.Склад);
    СтруктураПараметровПодбора.Вставить("ТипЦен"				  , Объект.ТипЦен);
    СтруктураПараметровПодбора.Вставить("ДоговорКонтрагента"	  , Объект.ДоговорКонтрагента);
    СтруктураПараметровПодбора.Вставить("Контрагент"			  , Объект.Контрагент);
    СтруктураПараметровПодбора.Вставить("Сделка"				  , Объект.Сделка);
    СтруктураПараметровПодбора.Вставить("Организация"			 , Объект.Организация);
    СтруктураПараметровПодбора.Вставить("Качество"				, Качество);
    СтруктураПараметровПодбора.Вставить("СпособЗаполненияЦен"	 , СпособЗаполненияЦен);
    СтруктураПараметровПодбора.Вставить("ЕстьЦена"				, ЕстьЦена);
    СтруктураПараметровПодбора.Вставить("ЕстьСерия"			   , ЕстьСерия);
    СтруктураПараметровПодбора.Вставить("ВалютаДокумента"		 , Валюта);
    СтруктураПараметровПодбора.Вставить("РазворачиватьДоКачества" , РазворачиватьДоКачества);
    СтруктураПараметровПодбора.Вставить("ПодбиратьУслуги"		 , ПодбиратьУслуги);
    СтруктураПараметровПодбора.Вставить("СкрыватьХарактеристику"  , СкрыватьХарактеристику);
    СтруктураПараметровПодбора.Вставить("Заголовок", "Подбор номенклатуры в документ " +
    ПредставлениеДок + " № " + Объект.Номер + " (" + ИмяТабличнойЧасти + ")");
    СтруктураПараметровПодбора.Вставить("УсловиеПродаж"		   , Объект.УсловиеПродаж);
    СтруктураПараметровПодбора.Вставить("ЕстьСкладВТабличнойЧасти", ЕстьСкладВТабличнойЧасти);
    СтруктураПараметровПодбора.Вставить("ВременныеТаблицы"		, ОбработкаТабличныхЧастей.СтруктураДляРасчетаРезерваПриПодбореНоменклатуры(Объект.ПолучитьФорму("ФормаДокумента"), Истина, "Сделка"));
    ОткрытьПодборНоменклатуры(?(Объект.ЭтоНовый(), Объект.ПолучитьФорму("ФормаДокумента"), Объект.Ссылка.ПолучитьФорму("ФормаДокумента")), СтруктураПараметровПодбора, МетаданныеОбъекта);
    
    КонецПроцедуры
    //
    //Для документа РеализацияТоваровУслуг
    //////////////////////////////////////////////////////////////
    
  5. TopicStarter Overlay
    BigAnn
    Offline

    BigAnn Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое. Я начинала так делать, но запуталась быстро. И решила, что что-то не так)) значит будем разбираться дальше)
  6. TopicStarter Overlay
    BigAnn
    Offline

    BigAnn Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    26
    Разобралась) Обработку подключила, работает. Теперь самое страшное. Нужно изменить табличную часть при подборе по справочнику. Необходимо добавить дополнительные поля.
    Мне подсказали, что нужно писать запрос. Я его вроде как написала, но куда его приделать? Опять запуталась
    Код:
    Выбрать
    СпрНом.Код,
    СпрНом.Артикул,
    СпрНом.Ссылка,
    СпрНом.БазоваяЕдиницаИзмерения как Ед,
    СпрНом.ЕдиницаДляОтчетов.Коэффициент как Коэфф,
    СпрЦена.Цена,
    РегОст.Количество как Остаток,
    СпрСв.Значение как Производитель
    из
    Справочник.Номенклатура как СпрНом,
    
    Левое Внешнее Соединение
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних как СпрЦена
    По
    СпрЦена.Номенклатура = СпрНом.Ссылка И
    СпрЦена.ТипЦен = &Базовая
    Левое Внешнее Соединение
    РегистрНакопления.ТоварыНаСкладах как РегОст
    По
    РегОст.Номенклатура = СпрНом.Ссылка
    Левое Внешнее Соединение
    РегистрСведений.ЗначенияСвойствОбъектов как СпрСв
    По
    СпрСв.Объект = СпрНом.Ссылка 
  7. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Если Вы говорите об изменении данных табличной части документа то изначально пошли не правильным путем, т.к. сама обработка получения данных выполняется на стороне формы документа.
    Предположим, в обработке выбрали какую-то позицию, Вы заполняете параметр возврата (структуру) данными которые надо передать. Вернемся немного назад. Когда вызывается обработка, её форма вызывается с указанием владельца, т.е. какой форме принадлежит данная форма. Владелец указывается вторым параметром метода ПолучитьФорму().
    Код:
    ФормаПодбора = <Обработка>.Получитьформу("ИмяФормы", ВладелецФормы).Открыть();

    В коде выше это описано так
    Код:
    ОткрытьПодборНоменклатуры(?(Объект.ЭтоНовый(), Объект.ПолучитьФорму("ФормаДокумента"), Объект.Ссылка.ПолучитьФорму("ФормаДокумента")), СтруктураПараметровПодбора, МетаданныеОбъекта);
    Таким образом форма подбора помнит кому она принадлежит. После подготовки данных для передачи владельцу в подборе вызывается метод ОповеститьОВыборе(ЗначениеВыбора) и форма подбора возвращает переменную ЗначениеВыбора в форму владельца
    Форма владелец получает сообщение о том что при шли внешние данные и запускает событие формы "ОбработкаВыбора" (Именно событие формы, там есть такое событие посмотрите внимательно). В процедуру этого события передается в качестве параметра результат выбора из формы подбора и именно в этой форме выполняется обработка значения выбора.

    Теперь к нашему вопросу, если Вам нужно обработать результат выбора, то без изменений конфигурации Вам не обойтись.
    Примерно так все работает, подробно я описывал ранее на форуме. Удачи!
  8. TopicStarter Overlay
    BigAnn
    Offline

    BigAnn Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    26
    Мне нужно изменить не табличную часть документа, а табличную часть подбора.
    Т.е. стандартно в обработке подбора "по справочнику" имеются поля: картинка, код, артикул, номенклатура, единица хранения остатков, и остатки по желанию.
    Мне нужно сюда еще добавить цену, коэффициент единицы для отчетов, и свойство номенклатуры.
    Так понятнее, что мне нужно изменить?
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    BigAnn, чтобы подробно объяснять как - реально много писать надо. Я не осилю. Смотрите как сделан вывод остатков в форме подбора, делайте по такому же принципу.

Поделиться этой страницей