Создание документа Установка цен номенклатуры без записи документа

11.03.21

Разработка - Универсальные функции

Рабочий механизм создания документа Установка цен номенклатуры в КА 2 и УТ 11, без сохранения документа и с рабочим отображением заполненных данных.

День добрый.

Много шерстил Сеть в поиске решения проблемы.

Знающим известно, что этот документ в УТ 11, КА 2 и Рознице 2 выглядит не так, как хранится его содержимое.

На первой вкладке у нас все виды цен, их зависимости и настройки формирования. Выставив галочки на нужном виде цен и перейдя в таблицу товаров, мы переходим в Дерево товаров, который формируется при открытии на основе записанных данных, либо перестраивается при изменении содержания таблицы товаров.

Изначально я использовал стандартный способ создания документа - на клиенте вызывал форму, брал объект, заполнял его на сервере и копировал в объект вызванной формы, потом уже открывал форму.

Но с этим документом такое не сработало. Все необходимые методы формы по заполнению элементов это самой формы сработали при вызове этой же пресловутой формы. Дальнейшее заполнения данных объекта никак не влияли на содержание элементов формы. И открывалась форма так же, как если бы мы создали новый документ.

У меня была задачка загрузить цены из внешнего источника и открыть документ. Сама задача тут не рассматривается. Будет показан вариант, как я решил задачу открытия формы еще не записанного документа с заполненными данными.

Она оказалась не настолько сложна, просто надо было изучить метод заполнения документа в модуле объекта.

Там идет сравнение типа данных для заполнения и в самом низу была проверка на тип Структура. От нее и решил отталкиваться.

Структура там простая - два поля с именами Дата и ТаблицаНоменклатуры. Если Дата может содержать в себе просто дату будущего документа, то поле Таблица Номенклатуры должна содержать в себе адрес данных во временном хранилище

 

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
		//...
		//несколько проверок на типы документов
		//...
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда		
		Если ДанныеЗаполнения.Свойство("ТаблицаНоменклатуры") Тогда			
			ЗаполнитьПоТаблицеНоменклатуры(
				ДанныеЗаполнения);			
		КонецЕсли;		
	КонецЕсли;
КонецПроцедуры

Тут вызывается метод ЗаполнитьПоТаблицеНоменклатуры

Процедура ЗаполнитьПоТаблицеНоменклатуры(ДанныеЗаполнения)
	
	ТаблицаНоменклатуры = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.ТаблицаНоменклатуры);
	Товары.Загрузить(ТаблицаНоменклатуры);
	
	ТаблицаНоменклатуры.Свернуть("ВидЦены");
	
	ВидыЦен.Загрузить(ТаблицаНоменклатуры);
	
	Дата = ДанныеЗаполнения.Дата;
		
КонецПроцедуры

Вот из этих знаний и было найдено решение.

Просто покажу код заполнения, думаю, многие поймут, что тут. Переменная ТипЦеныДокумента - реквизит формы для подстановки нужного вида цены. ДатаДокумента - также реквизит, взятый из внешнего источника.

&НаСервере
Функция ПолучитьАдресТаблицыТоваров()
	ТаблицаНоменклатуры = новый ТаблицаЗначений;
	ТаблицаНоменклатуры.Колонки.Добавить("Номенклатура");
	ТаблицаНоменклатуры.Колонки.Добавить("Характеристика");
	ТаблицаНоменклатуры.Колонки.Добавить("ВидЦены");
	ТаблицаНоменклатуры.Колонки.Добавить("Цена");
	Для каждого Товар из Товары Цикл
		НоваяСтрока = ТаблицаНоменклатуры.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, товар);
		НоваяСтрока.ВидЦены = ТипЦеныДокумента;
	КонецЦикла;
	Адрес = ПоместитьВоВременноеХранилище(ТаблицаНоменклатуры, ЭтаФорма.УникальныйИдентификатор);
	Возврат Адрес
КонецФункции

&НаКлиенте
Процедура ЗагрузитьЦены(Команда)
	Для каждого Товар из Товары Цикл
		Если Товар.Номенклатура.Пустая() или (Товар.Характеристика.Пустая() и НЕ ПустаяСтрока(Товар.ХарактеристикаИзФайла)) Тогда
			ПоказатьПредупреждение(,"Есть незаполненные строки");
			Возврат
		КонецЕсли;
	КонецЦикла;	
	СтруктураЗаполнения = Новый Структура;
	СтруктураЗаполнения.Вставить("Дата", ДатаДокумента);	
	Адрес = ПолучитьАдресТаблицыТоваров();
	СтруктураЗаполнения.Вставить("ТаблицаНоменклатуры", Адрес);
	П = Новый Структура("ЗначенияЗаполнения", СтруктураЗаполнения);
	ОткрытьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта", П, ЭтаФорма);
КонецПроцедуры

После выполнения данного кода форма документа открывается в готовом виде и можно только нажать Провести и закрыть.

 

Возможно, я не открыл америку и не изобрел велосипед, но несколько часов серфинга по различным форумам в поиске решения проблемы мне не помогли.

Я не претендую на уникальность решения (повторюсь - искал долго) и прошу не обращать внимания на вероятные ляпы в алгоритме. Я просто хотел поделиться готовым решением поставленной задачи.

Проверил функционал на УТ 11.4.13.71 и КА 2.4.13.96. Как будет работать механизм с другими конфигурациями, не берусь сказать. К примеру, в конфигурации Розница:Аптека 2.6 нет такого заполнения, в типовой Рознице не проверял. Если в методе ОбработкаЗаполнения есть проверка на структуру и далее заполнение будет так же, как указано выше - механизм сработает.

Надеюсь, кому-нибудь будет полезно.

Всем добра!

УстановкаЦенНоменклатуры загрузка цен открытие формы

См. также

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Статистическая выборка сценариев и точек изменения отчетов на общей форме ФормаОтчета в типовых конфигурациях. Примеры кода.

03.06.2024    3100    Serg2000mr    29    

100

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    12413    dimanich70    81    

126

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    3438    3    John_d    11    

57

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Стажер Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    5673    mrXoxot    11    

106

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    4817    ke.92@mail.ru    16    

65

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Бесплатно (free)

Разбираемся, зачем в системе ЕРП созданы справочники: ключи аналитик учета, зачем созданы аналогичные по набору измерений регистры сведений. Какие проблемы они решают, какие создают новые и что с этим делать.

08.11.2023    9972    ids79    25    

78

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    11772    YA_418728146    7    

158
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. shtinalex 276 11.03.21 12:19 Сейчас в теме
Плюсую, тоже вначале записывал объект, а потом открывал форму. После уже дошёл до этот метода загрузки без записи документа. Вот рабочий пример: Обработка загрузки цен в документ "Установка цен номенклатуры"
2. obmanOZ 33 15.03.21 11:22 Сейчас в теме
Пасиб, посмотрю можно ли на рознице сделать подобное. У меня работает через костыль )
3. shtinalex 276 13.05.21 10:23 Сейчас в теме
(2) В рознице есть типовая обработка для загрузки номенклатуры и цен из файла, называется "Загрузка данных из файла". Я её брал за основу для Загрузка цен из файла Excel в документ "Установка цен номенклатуры"
4. rabotana 13.01.23 09:09 Сейчас в теме
Пришло ценообразование 2,5, и всё стало нерабочим. Может кто подскажет что теперь надо поправить в этом методе?
5. Vladimir_D 121 13.01.23 09:44 Сейчас в теме
(4)это в каком релизе? Перестал следить.
6. rabotana 13.01.23 10:22 Сейчас в теме
с 11,5 по идее, там можно (и видимо нужно ) выбирать метод ценообразования 11.5, вот пока его не включил - работает. В установке цен я так понял задействуется табличнаяЧасть Товары2_5, новая ветка в заполнении (это наверное пришло из CRM или КА2.5)
7. Vladimir_D 121 13.01.23 10:29 Сейчас в теме
(6)понятно. Вполне может быть. Надо глянуть.
8. EugeneR1c 26.01.23 18:56 Сейчас в теме
Спасибо! Пригодилось!
9. ANF-BR 03.03.23 12:02 Сейчас в теме
Спасибо за решение, очень помогло! А не подскажите как сделать так чтобы документ создавался не с одним видом цен, а с несколькими?
10. ANF-BR 03.03.23 12:58 Сейчас в теме
11. gtrr34 7 10.09.23 14:48 Сейчас в теме
СПАСИБИЩЕ!
мне повезло, промучился своими силами только час, потом пошел серфить и сразу вышла ваша подсказка.
УТ 11.5.13
в настройках отключены цены 2,5 и этот код работает! ура!

Ниже упрощенный вариант, если нужно открыть документ с одной определенной номенклатурой (без характеристик)

&НаСервере
Функция ПолучитьАдресТаблицыТоваров()
	
	ТаблицаНоменклатуры = новый ТаблицаЗначений;
	ТаблицаНоменклатуры.Колонки.Добавить("Номенклатура");
	ТаблицаНоменклатуры.Колонки.Добавить("ВидЦены");
	ТаблицаНоменклатуры.Колонки.Добавить("Цена"); 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ВидыЦен.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ВидыЦен КАК ВидыЦен";

	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = ТаблицаНоменклатуры.Добавить(); 
		НоваяСтрока.Номенклатура = Номенклатура;//Ссылка на номенклатуру
		НоваяСтрока.ВидЦены = Выборка.Ссылка;
	КонецЦикла;

	Адрес = ПоместитьВоВременноеХранилище(ТаблицаНоменклатуры, ЭтаФорма.УникальныйИдентификатор);
	Возврат Адрес
КонецФункции

&НаКлиенте
Процедура УстановитьЦены(Команда)
	СтруктураЗаполнения = Новый Структура;
	СтруктураЗаполнения.Вставить("Дата", ТекущаяДата());	
	Адрес = ПолучитьАдресТаблицыТоваров();
	СтруктураЗаполнения.Вставить("ТаблицаНоменклатуры", Адрес);
	П = Новый Структура("ЗначенияЗаполнения", СтруктураЗаполнения);
	ОткрытьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта", П, ЭтаФорма);
КонецПроцедуры
Показать
nekiilik1c; +1 Ответить
12. gtrr34 7 10.09.23 15:24 Сейчас в теме
Комментарий заполнил таким костылем:

В процедуре на клиенте где заполняем структуру добавил строку

	СтруктураЗаполнения.Вставить("Комментарий", "Документ создан .... ";



В расширение перенес процедуру "ОбработкаЗаполнения" из модуля объекта Документы.УстановкаЦенНоменклатуры

&После("ОбработкаЗаполнения")
Процедура ХХ_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ЭтотОбъект.Комментарий = "" Тогда
		ЭтотОбъект.Комментарий = ДанныеЗаполнения.Комментарий;
	КонецЕсли
	
КонецПроцедуры
Показать
13. gtrr34 7 12.09.23 18:34 Сейчас в теме
Долго промучился с задачей открыть по ссылке документ Установка цен номенклатуры и добавить в него новый товар. Когда пазл сошелся оказалось все просто. Я только начал ковырять 1с и этот сложно устроенный документ заставил попотеть :)

&НаКлиенте
Процедура АК_ДобавитьВПоследнийДокЦен(Команда) 
	
	П = Новый Структура("Ключ", АК_ПолучитьПоследнийДокЦен());//Там запросом получаю ссылку на последний документ УЦН
	П.Вставить("АК_ЗаполнитьТЧ",Истина);//Этот параметр - тригер в "ПриСозданииНаСервере"
	П.Вставить("АК_Номенклатура",Объект.Ссылка);//Тут передаю ссылку на добавляемую номенклатуру
	Форма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента",П,,);
	Форма.Модифицированность = Истина;//Без этой строки открытую форму можно закрыть и новая строка не сохранится
	Форма.Открыть();
	
КонецПроцедуры
Показать



&НаСервере
Процедура АК_ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка) //Обязательно "Перед" иначе дерево цен не заполнится
	
	Попытка //без попытки: если открывать форму например из списка без переданных параметров - будет ошибка типа "Нет такого параметра..."
		Если Параметры.АК_ЗаполнитьТЧ Тогда
			
			Запрос = Новый Запрос;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	ВидыЦен.Ссылка КАК Ссылка
			|ИЗ
			|	Справочник.ВидыЦен КАК ВидыЦен";
			
			РезультатЗапроса = Запрос.Выполнить();
			Выборка = РезультатЗапроса.Выбрать();
			
			Пока Выборка.Следующий() Цикл
				НоваяСтрока = Объект.Товары.Добавить(); 
				НоваяСтрока.Номенклатура = Параметры.АК_Номенклатура;
				НоваяСтрока.ВидЦены = Выборка.Ссылка;
			КонецЦикла;
		КонецЕсли;	
	Исключение
	КонецПопытки; 	
	
КонецПроцедуры
Показать
14. Miket78 23 20.03.24 15:06 Сейчас в теме
В УТ 11.5 для ценообразования 2.5 значение цены не заполняется. Виды цен и номенклатура заполняется, а цены пустые. В процедуре ЗагрузитьТовары для 2.5 в СтруктураРезультата.ТаблицаТоваров отсутствует колонка Цена, хотя на входе в ТаблицаТовары колонка Цена есть и она заполнена. Как побороть?

Процедура ЗагрузитьТовары(ТаблицаТовары)
	
	ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
	
	Если ИспользуетсяЦенообразование25 Тогда
		Если ТаблицаТовары.Колонки.Найти("Упаковка") = Неопределено Тогда
			ТаблицаТовары.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиЕдиницыИзмерения"));
		КонецЕсли;
		
		Если ТаблицаТовары.Колонки.Найти("Серия") = Неопределено Тогда
			ТаблицаТовары.Колонки.Добавить("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
		КонецЕсли;
		
		Если ТаблицаТовары.Колонки.Найти("Характеристика") = Неопределено Тогда
			ТаблицаТовары.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
		КонецЕсли;
	
		СтруктураНастроек = Новый Структура();
		СтруктураНастроек.Вставить("ТаблицаТоваров", ТаблицаТовары);
		СтруктураНастроек.Вставить("ИмяМакетаСхемыКомпоновкиДанных", "Макет2_5");
		СтруктураНастроек.Вставить("КомпоновщикНастроек", Неопределено);
		СтруктураНастроек.Вставить("ВестиУчетСертификатовНоменклатуры", Ложь);
		СтруктураНастроек.Вставить("ИспользуетсяОтборПоВнешнемуИсточникуДанных", Истина);
		СтруктураНастроек.Вставить("ОбязательныеПоля"   , Новый Массив);

		СтруктураНастроек.ОбязательныеПоля.Добавить("Номенклатура");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Характеристика");
		СтруктураНастроек.ОбязательныеПоля.Добавить("ХарактеристикаЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Серия");
		СтруктураНастроек.ОбязательныеПоля.Добавить("СерияЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Упаковка");
		СтруктураНастроек.ОбязательныеПоля.Добавить("УпаковкаЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("ВидЦены");
		
		СтруктураРезультата = Обработки.ПодборТоваровПоОтбору.ПодготовитьСтруктуруДанных(СтруктураНастроек);
		
		Товары2_5.Загрузить(СтруктураРезультата.ТаблицаТоваров);
	Иначе
		Товары.Загрузить(ТаблицаТовары);
	КонецЕсли;
		
КонецПроцедуры
Показать
16. ISTrinux 20.05.24 09:16 Сейчас в теме
17. Miket78 23 20.05.24 14:19 Сейчас в теме
(16) Нет. Сделал через запись и открытие документа.
15. knutovis 10.04.24 08:09 Сейчас в теме
Спасибо добрый человек! И так и сяк крутил вчера этот документ, наткнулся на вашу статью доделал задачу за 10 минут :)
Vladimir_D; +1 Ответить
Оставьте свое сообщение