Расширения... Использование на практике. Пример заполнения табличных частей в 1С Бухгалтерия 3.0.

05.08.15

Разработка - Механизмы типовых конфигураций

В 1С Бухгалтерия 3.0, возникла проблема, может мелочь но дико мешает. При заполнении табличных частей постоянно просит записать документ.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение ЗаполнениеТЧ
.cfe 47,93Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.
Пример заполнения табличной части (Перемещение товаров, по всем остаткам)
.epf 16,56Kb
5
5 Скачать (1 SM) Купить за 1 850 руб.

Пользователям после перехода с 2.0 эта функция очень не нравиться: документ проведен, пользователь нажимает заполнение, разумеется, не читая о чем, его спрашивает программа. Далее  документ записывается, остатки двигаются, оригинал документа теряется, шум, гам, крик, истерика.

Посмотрели БСП.... никаких настроек по этому поводу нет. Проблема та вроде ерундовая, как заноза, вроде мелочь а неприятно.

И вот наконец то вышел релиз Бухгалтерии 3.0.41.48, с которого разрешено создавать расширения, с помощью них мы и решили данную проблему.

И так, мы создали расширение с названием "ЗаполнениеТЧ", перенесли в него документ "Перемещение материалов" и его основную форму. 

В Форме разместили следующий код:

&НаКлиенте
Процедура Расш_ЗаполнениеТЧ_ПриОткрытии(Отказ)
	Расш_ЗаполнениеТЧ_ПриОткрытииНаСервере();
КонецПроцедуры

&НаСервере
Процедура Расш_ЗаполнениеТЧ_ПриОткрытииНаСервере()
	
	ПриСозданииФормыНаСервере();
	
КонецПроцедуры

Процедура ПриСозданииФормыНаСервере() Экспорт 
	
	Попытка
		ОчиститьЭлементыФормы();        	
		ПриСозданииНаСервере_1();
	Исключение
		ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
	КонецПопытки;
	
КонецПроцедуры
Процедура "ОчиститьЭлементыФормы" убирает кнопки заполнения и команды с формы, которые были созданы типовым кодом в процедуре "ПриСозданииНаСервере":
Процедура ОчиститьЭлементыФормы() Экспорт 
	
	ИИ = 0 ;
	
	Пока Истина Цикл 
		
		Попытка
			Этаформа.Элементы.Удалить(Этаформа.Элементы.Найти("КомандаДополнительнойОбработки"+ Формат(ИИ, "ЧГ=")));
			ЭтаФорма.Команды.Удалить(ЭтаФорма.Команды.Найти("КомандаДополнительнойОбработки"+ Формат(ИИ, "ЧГ=")));
		Исключение  
			Прервать;
		КонецПопытки;
		
	КонецЦикла;
	
	ЭтаФорма.Команды.Удалить(ЭтаФорма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище"+ Формат(ИИ, "ЧГ=")));
	
КонецПроцедуры
Следующая процедура: "ПриСозданииНаСервере_1" взята из БСП, с одним изменением, действия команды изменено.
Процедура ПриСозданииНаСервере_1(ТипФормы = Неопределено) Экспорт
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда
		Возврат;
	КонецЕсли;
	
	// Установка параметров формы для команд вызова дополнительных отчетов и обработок.
	Параметры_1 = ДополнительныеОтчетыИОбработкиПовтИсп.ПараметрыФормыНазначаемогоОбъекта(ЭтаФорма.ИмяФормы, ТипФормы);
	Если ТипЗнч(Параметры_1) <> Тип("ФиксированнаяСтруктура") Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФункциональныхОпций = Новый Структура;
	ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", Параметры_1.СсылкаРодителя);
	ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиТипФормы",         ?(ТипФормы = Неопределено, Параметры_1.ТипФормы, ТипФормы));
	
	УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФункциональныхОпций);
	            
	Если Параметры_1.ВыводитьПодменюЗаполнениеОбъекта Тогда
		СформироватьПодменюКомандЗаполнения(Параметры_1);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Функция ВыполнитьНазначаемуюКомандуНаКлиенте(ИмяЭлемента) Экспорт
	ОчиститьСообщения();
	
	ВыполняемаяКоманда = ДополнительныеОтчетыИОбработкиВызовСервера.ОписаниеКомандыОбработки(ИмяЭлемента, 
		ЭтаФорма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище").Действие);
	
	Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы") Тогда
		Возврат Ложь; // Для выполнения команды требуется контекстный вызов сервера.
	КонецЕсли;
		
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Форма",  ЭтаФорма);
	ДополнительныеПараметры.Вставить("Объект", Объект);
	ДополнительныеПараметры.Вставить("ВыполняемаяКоманда", ВыполняемаяКоманда);
	//
	//Если Объект.Ссылка.Пустая() Или Форма.Модифицированность Тогда
	//	ТекстВопроса = СтрШаблон(
	//		НСтр("ru = 'Для выполнения команды ""%1"" необходимо записать данные.'"),
	//		ВыполняемаяКоманда.Представление);
	//	
	//	Кнопки = Новый СписокЗначений;
	//	Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Записать и продолжить'"));
	//	Кнопки.Добавить(КодВозвратаДиалога.Отмена);
	//	
	//	Обработчик = Новый ОписаниеОповещения("ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	//	ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да);
	//Иначе
		ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение(-1, ДополнительныеПараметры);
	//КонецЕсли;
	
	Возврат Истина; // Для выполнения команды достаточно клиентского контекста.
	
КонецФункции 

В процедуре "ВыполнитьНазначаемуюКомандуНаКлиенте" закоментарили проверку модифицированности формы. Готово, программа больше не заставляет записывать документ перед заполнением.
Для того что бы работала во всех документах, конечно необходимо процедуры вынести в общий модуль(для удобства), и раскидать вызовы этих процедур по другим документам.

Расширения... Использование на практике. Пример заполнения табличных частей в Бухгалтерия 3.0.

См. также

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

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    1857    PROSTO-1C    0    

18

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

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    1901    Vidz    0    

11

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

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

24.06.2024    1165    olja-ljaaa    0    

3

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

Проблемы при создании ресурсной спецификации. Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5.

06.05.2024    1273    It-digit    1    

2

Механизмы типовых конфигураций Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

11.04.2024    1119    tango    5    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Brawler 458 05.08.15 16:00 Сейчас в теме
Не вижу ничего страшного в том, что документы записываются перед изменением.
К тому же, если в базе данных включено версионирование при записи, то всегда можно вернуть документ в исходное состояние.
rimma_n; demkonst; +2 Ответить
2. mihey 11 05.08.15 16:16 Сейчас в теме
Запись перед заполнением это не ошибка ее исправлять не нужно.
demkonst; +1 Ответить
3. CratosX 114 09.01.17 18:51 Сейчас в теме
Что за функция МодульСтандартныхПроцедур_Сервер_Зеркало во внешней обработке?
Оставьте свое сообщение