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

05.08.15

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

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

Скачать исходный код

Наименование Файл Версия Размер
Расширение ЗаполнениеТЧ
.cfe 47,93Kb
3
.cfe 47,93Kb 3 Скачать
Пример заполнения табличной части (Перемещение товаров, по всем остаткам)
.epf 16,56Kb
5
.epf 16,56Kb 5 Скачать

Пользователям после перехода с 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С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

11.04.2024    540    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

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

Какому-либо элементу списка сопоставляется числовое значение, зависящее от других значений, причем эта зависимость изменяется от элемента к элементу. Так, в справочнике "Валюты" курс какой-либо валюты может быть задан формулой (или даже запросом) от значения другой валюты. А в справочнике "Виды цен" формула определяет расчет цены для товарной позиции, т.е. элементов справочника "Номенклатура", у которых в карточке указан этот вид цены. А в 1С:ERP, например, этот механизм используется в ресурсной спецификации.

10 стартмани

11.04.2024    422    tango    5    

4

Ценовая власть. Второй сезон

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

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

08.04.2024    791    tango    0    

2

Ценовая власть (УТ 11.5) - 2

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

В прошлый раз специальной обработкой мы выбрали объекты УТ 1.5, группируя по подсистемам. Оказалось, что состав подсистем не вполне корректно отображает функциональную структуру, но зато мы нашли процедуру, которая, вроде бы, должна содержать в себе всё, что нас интересует. Обновление цен должно ведь следовать выбранной стратегии ценообразования, верно? Иначе что она обновляет...

06.04.2024    483    tango    1    

1

Ценовая власть или Управление ценообразованием (УТ 11.5)

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

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    599    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

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

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2682    YA_418728146    11    

45

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1213    8    2ncom    6    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

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

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

28.12.2023    5038    mrXoxot    11    

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