Кнопка во всех формах конфигурации "Бухгалтерия 3.0.х"

1. wrooom 163 12.09.22 15:18 Сейчас в теме
В УТ11.4 есть МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере, а в БП3.0 ?
Так же в УТ11.4 есть МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду, а в БП3.0 ?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
3. EVKash 14 12.09.22 15:53 Сейчас в теме +5 $m
(1) 1. можно прицепиться к какой-нибудь другой общей процедуре. например
ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
2. Есть
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
(2)
ПодключаемыеКоманды.ПриСозданииНаСервере
Не во всех формах есть.
Естественно, захватывать их в расширение и использовать с инструкцией &После.
Лучше вместо и если команда не своя, то ПродолжитьВызов. Иначе можно на ошибки нарваться типа команда не найдена в ПараметрыПодключаемыхКоманд.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. ixijixi 1686 12.09.22 15:50 Сейчас в теме
А в БП нету. Рекомендую использовать ПодключаемыеКоманды.ПриСозданииНаСервере И ПодключаемыеКомандыКлиент.ВыполнитьКоманду. Естественно, захватывать их в расширение и использовать с инструкцией &После.
wrooom; 0x00; +2 Ответить
3. EVKash 14 12.09.22 15:53 Сейчас в теме +5 $m
(1) 1. можно прицепиться к какой-нибудь другой общей процедуре. например
ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
2. Есть
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
(2)
ПодключаемыеКоманды.ПриСозданииНаСервере
Не во всех формах есть.
Естественно, захватывать их в расширение и использовать с инструкцией &После.
Лучше вместо и если команда не своя, то ПродолжитьВызов. Иначе можно на ошибки нарваться типа команда не найдена в ПараметрыПодключаемыхКоманд.
4. wrooom 163 12.09.22 20:45 Сейчас в теме
Пишет ошибку при нажатии на кнопку : {ОбщийМодуль.ПодключаемыеКоманды.Модуль(1372)}: Сведения о команде "КомандаTtt" не существуют. Не знаю как побороть.
5. EVKash 14 13.09.22 08:04 Сейчас в теме
(4) я же писал об этом... надо
&Вместо("ВыполнитьКоманду")
Процедура Расш1_ВыполнитьКоманду(Форма, Команда, Источник)
	
	Если Команда.Имя = "КомандаTtt" Тогда
		//Делаем что надо
	Иначе
		ПродолжитьВызов(Форма, Команда, Источник);
	КонецЕсли;
	
КонецПроцедуры
Показать
Безопасный режим у расширения должен быть отключен.
6. wrooom 163 13.09.22 09:28 Сейчас в теме
(5) если использовать &вместо , тогда процедура не будет работать на других конфигурациях.
7. EVKash 14 13.09.22 09:37 Сейчас в теме
(6)
если использовать &вместо , тогда процедура не будет работать на других конфигурациях.
что значит "не будет работать на других конфигурациях"?
8. wrooom 163 13.09.22 09:42 Сейчас в теме
(7) в тех конфигурациях, где не объявлены переменные, которые используются в этой процедуре. Я Имею ввиду старые версии бух3.0
9. EVKash 14 13.09.22 10:12 Сейчас в теме
(8) не понимаю, какие переменные? пример бы...
"Вместо" в случае (5) - это практически "Перед", только с проверкой условия - выполнять стандартный метод или нет.
10. VyacheslavShilov 29.09.23 18:04 Сейчас в теме
Кто-нибудь может подсказать, как возможно в УНФ (3.0.2.215) (платформа 8.3.23.1865) добавить, используя конфигурацию-расширение и общие модули в рабочей конфигурации, - новую команду заполнения (с подтверждением по вопросу пользователю) для ТЧ "Товары" у документа (Вывод из оборота ИС МП), не добавляя в расширение форму этого документа?
Насколько понял - нужно использовать модули "ПодключаемыеКоманды" и "ПодключаемыеКомандыКлиент".
Пробовал сделать, как описываю ниже, но вызвать выполнение команды на сервере не получается.

1. Код в расширенном модуле "ПодключаемыеКомандыКлиент":

&Вместо("ВыполнитьКоманду")
Процедура ГМ_ВыполнитьКомандуПеред(Форма, Команда, Источник)
	Если Команда.Имя = "ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами" Тогда
		ОчиститьСообщения();
		Если Форма.ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами = Истина Тогда
			Форма.ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами = Ложь;
		КонецЕсли;
		ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами(Форма);
	Иначе
		ПродолжитьВызов(Форма, Команда, Источник);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами(Форма)
	
	Если Форма.Объект.Товары.Количество() > 0 Тогда //И ЗадаватьВопрос Тогда
		
		ТекстВопроса = НСтр("ru = '(ГМ:) Колонка ""Цена"" док-та будет перезаполнена по базовой цене на дату док-та. Продолжить?'");
		Ответ = Неопределено;
		ДополнительныеПараметры = Новый Структура("Форма", Форма);
		ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения("ГМ_ВопросОПерезаполнениииБазовымиЦенами", ЭтотОбъект, ДополнительныеПараметры);
		ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ГМ_ВопросОПерезаполнениииБазовымиЦенами(Результат, Параметры) Экспорт
	
	Если Параметры.Форма.ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами = Истина Тогда
		Параметры.Форма.ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами = Ложь;
	КонецЕсли;
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		Параметры.Форма.ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами = Истина;
		//ГМ_ОбщийМодульСервер.ГМ_ЗаполнитьБазовымиЦенамиНаСервере(Параметры.Форма);
	КонецЕсли;
	
КонецПроцедуры

2. Код в расширенном модуле "ПодключаемыеКоманды":
&Перед("ПриСозданииНаСервере")
Процедура ГМ_ПриСозданииНаСервере(Форма, ПараметрыРазмещения)
	Если Форма.ИмяФормы = "Документ.ВыводИзОборотаИСМП.Форма.ФормаДокумента" 			Тогда
		ГМ_ПриСозданииНаСервереДокВыводИзОборотаИСМПФормаДокумента(Форма);
	КонецЕсли;
КонецПроцедуры

Процедура ГМ_ПриСозданииНаСервереДокВыводИзОборотаИСМПФормаДокумента(Форма)
	
	ГМ_РаботаС_ЭлементамиФормы.СоздатьКоманду(Форма, "ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами", "Подключаемый_ВыполнитьКоманду");
	СтруктураСвойствКнопки = ГМ_РаботаС_ЭлементамиФормы.СвойстваКнопки();
	СтруктураСвойствКнопки.Заголовок = "(ГМ) Заполнить базовыми ценами (заполнять после подбора по маркам!)";
	ГМ_РаботаС_ЭлементамиФормы.СоздатьКнопку(Форма, "ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами", Форма.Элементы.ТоварыПодменюЗаполнить, "ГМ_ДокВыводИзОборотаТоварыЗаполнитьБазовымиЦенами", СтруктураСвойствКнопки);
	
	ГМ_РаботаС_ЭлементамиФормы.ДобавитьРеквизит(Форма, "ГМ_ОтветДаНаВопросОПерезаполнениииБазовымиЦенами", "Булево", "(ГМ) Ответ ""Да"" на вопрос о перезаполнениии базовыми ценами", , , Ложь);

КонецПроцедуры

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

3. Код в общем модуле "ГМ_ОбщийМодульСервер" (галки сервер, вызов сервера):
&НаСервере
Процедура ГМ_ЗаполнитьБазовымиЦенамиНаСервере(Форма) Экспорт
	
	//ГМ_ТекущийОбъект = РеквизитФормыВЗначение("Объект");
	ГМ_ДатаДок = Форма.Объект.Дата;//ГМ_ТекущийОбъект.Дата;
	Если Не ЗначениеЗаполнено(ГМ_ДатаДок) Тогда
		ГМ_ДатаДок = ТекущаяДата();
		Если ЗначениеЗаполнено(ГМ_ДатаДок) Тогда
			Сообщить("Цены перезаполняются на тек. дату: " + Строка(ГМ_ДатаДок) + ", т.к. дата док-та - пустая!");
		Иначе
			Сообщить("Цены перезаполняются по послед-й записи в рег-ре ""Цены номенк-ры"" (по типу цен ""Базовая цена""), т.к. дата док-та и тек. дата - пустые!");
		КонецЕсли;
	КонецЕсли;
	Если Не ЗначениеЗаполнено(ГМ_ДатаДок) Тогда
		ГМ_ДатаДок = Неопределено;
	КонецЕсли;
	
	// Делаем подобно заполнению в форме эл. док. "КорректировкаРеализации":
	Для Каждого ГМ_СтрТЧ Из Форма.Объект.Товары Цикл//ГМ_ТекущийОбъект.Товары Цикл
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
			|ИЗ
			|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ГМ_КонДата, ) КАК ЦеныНоменклатурыСрезПоследних
			|ГДЕ
			|	ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
			|	И ЦеныНоменклатурыСрезПоследних.Характеристика = &ХарактеристикаНоменклатуры
			|	И ЦеныНоменклатурыСрезПоследних.ВидЦен = &ВидЦен";
		
		Запрос.УстановитьПараметр("ГМ_КонДата", 				ГМ_ДатаДок);
		Запрос.УстановитьПараметр("Номенклатура", 				ГМ_СтрТЧ.Номенклатура);
		Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ГМ_СтрТЧ.Характеристика);
		Запрос.УстановитьПараметр("ВидЦен", 					Справочники.ВидыЦен.НайтиПоКоду("00-000001"));
		// <- "Базовая (Прайс) RUB"
		ГМ_РезультатЗапроса = Запрос.Выполнить();
		ГМ_ВыборкаДетальныеЗаписи = ГМ_РезультатЗапроса.Выбрать();
		Пока ГМ_ВыборкаДетальныеЗаписи.Следующий() Цикл
			ГМ_СтрТЧ.Цена = ГМ_ВыборкаДетальныеЗаписи.Цена;
			ГМ_СтавкаНДС20 = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
			Если ГМ_СтрТЧ.СтавкаНДС <> ГМ_СтавкаНДС20 Тогда
				ГМ_СтрТЧ.СтавкаНДС = ГМ_СтавкаНДС20;
			КонецЕсли;
			//ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(ГМ_СтрТЧ, ГМ_ТекущийОбъект); // Было в УПП.
			//ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(ГМ_СтрТЧ, ГМ_ТекущийОбъект); // Было в УПП.
			// По образцу из ОМ "ИнтеграцияИСУНФКлиент" (в "ПриИзмененииЦены")
			ПараметрыРасчета = Новый Структура("РассчитатьСумму, СуммаВключаетНДС", Истина, Истина);
			ТабличныеЧастиУНФКлиентСервер.РассчитатьСуммыВСтрокеТЧ(ГМ_СтрТЧ, ПараметрыРасчета);
		КонецЦикла;
	КонецЦикла;
	
	//ЗначениеВРеквизитФормы(ГМ_ТекущийОбъект, "Объект");
	
	Модифицированность = Истина;
	
КонецПроцедуры

4. Код в общем модуле "ГМ_РаботаС_ЭлементамиФормы" (галки сервер, вызов сервера) (источники кода - https://wiki.programstore.ru/programmnoe-izmenenie-formi-1s-s-pomoshyu-rasshireniy/ , https://infostart.ru/1c/articles/1556681/ ):
Функция СоздатьКоманду(Форма, НаимКоманды, Действие) Экспорт
	
	НоваяКоманда = Форма.Команды.Добавить(НаимКоманды);
	НоваяКоманда.Действие = Действие;
	
	Возврат НоваяКоманда;
	
КонецФункции

Процедура УстановитьСвойстваЭлементу(Элемент, СтруктураСвойств)
	
	Для Каждого Свойство Из СтруктураСвойств Цикл
		Элемент[Свойство.Ключ] = Свойство.Значение;
	КонецЦикла;
	
КонецПроцедуры


Процедура УстановитьСвойстваЭлементу(Элемент, СтруктураСвойств)
	
	Для Каждого Свойство Из СтруктураСвойств Цикл
		Элемент[Свойство.Ключ] = Свойство.Значение;
	КонецЦикла;
	
КонецПроцедуры

Функция СоздатьКнопку(Форма, НаимКнопки, РодительКнопки, НаимКоманды, СтруктураСвойств = Неопределено, ЭлементПеред = Неопределено) Экспорт
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма, НаимКнопки, Тип("КнопкаФормы"), РодительКнопки, ЭлементПеред);
	НовыйЭлемент.ИмяКоманды = НаимКоманды;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент, СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Функция добавляет реквизит формы
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Имя - Строка, содержит имя реквизита
//  Тип - Строка типа, Тип или ОписаниеТипов
//  Заголовок - Строка, содержит отображаемый текст реквизита
//Если заголовок не задан, то формируется функцией "ПолучитьЗаголовокПоИмени"
//  Путь - Строка, содержит путь к реквизиту, не включая имя реквизита
//  СохраняемыеДанные - Булево, если Истина - указывает, что это сохраняемый при записи реквизит, по умолчанию Ложь
//  Значение - Произвольный, значение, присваиваемое реквизиту после его создания
//
// Возвращаемое значение:
//  РеквизитФормы - созданный реквизит формы
//
Функция ДобавитьРеквизит(Форма, Наим, Тип, Заголовок = Неопределено, Путь = Неопределено, СохраняемыеДанные = Неопределено, Значение = Неопределено) Экспорт

	СвойстваРеквизита = Новый Структура;
	СвойстваРеквизита.Вставить("Имя", Наим);
	СвойстваРеквизита.Вставить("Тип", Тип);
	СвойстваРеквизита.Вставить("Заголовок", Заголовок);
	СвойстваРеквизита.Вставить("Путь", Путь);
	СвойстваРеквизита.Вставить("СохраняемыеДанные", СохраняемыеДанные);
	СвойстваРеквизита.Вставить("Значение", Значение);
	СвойстваРеквизитов = Новый Массив;
	СвойстваРеквизитов.Добавить(СвойстваРеквизита);
	Возврат ДобавитьРеквизиты(Форма, СвойстваРеквизитов)[0];

КонецФункции

// Функция добавляет реквизиты формы
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  СвойстваРеквизитов - Массив структур:
//   * Имя - Строка, содержит имя реквизита
//   * Тип - Строка типа, Тип или ОписаниеТипов
//   * Заголовок - необязательный элемент, Строка, содержит отображаемый текст реквизита
//Если заголовок не задан, то формируется функцией "ПолучитьЗаголовокПоИмени"
//   * Путь - необязательный элемент, Строка, содержит путь к реквизиту, не включая имя реквизита
//   * СохраняемыеДанные - необязательный элемент, Булево, если Истина - указывает, что это сохраняемый при записи реквизит, по умолчанию Ложь
//   * Значение - необязательный элемент, Произвольный, значение, присваиваемое реквизиту после его создания
//
// Возвращаемое значение:
//  Массив Реквизитов формы - созданные реквизиты формы
//
Функция ДобавитьРеквизиты(Форма, СвойстваРеквизитов) Экспорт

	НовыеРеквизиты = Новый Массив;

	Для Каждого СвойстваРеквизита Из СвойстваРеквизитов Цикл

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

		НовыйРеквизит = Новый РеквизитФормы(Имя, Тип, Путь, Заголовок, СохраняемыеДанные);
		НовыеРеквизиты.Добавить(НовыйРеквизит);

	КонецЦикла;

	Форма.ИзменитьРеквизиты(НовыеРеквизиты);

	Для Каждого СвойстваРеквизита Из СвойстваРеквизитов Цикл
		Если СвойстваРеквизита.Свойство("Значение") И СвойстваРеквизита.Значение <> Неопределено Тогда
			Форма[СвойстваРеквизита.Имя] = СвойстваРеквизита.Значение;
		КонецЕсли;
	КонецЦикла;

	Возврат НовыеРеквизиты;

КонецФункции

// Функция нужна для получения заголовка по переданному имени. Заголовок формируется так, как он был бы сформирован в конфигураторе.
// Также добавлен учет префикса произвольного вида. По умолчанию предполагается префикс такого вида: "Префикс_Имя".
// Префикс (включая разделитель) из заголовка удаляется.
// Функцию желательно отрефакторить. Там нетривиальные условия, которые получились эмпирически во время тестирования. Можно написать красивее.
// Типовой алгоритм преобразования имён в заголовки не такой простой, как кажется. 

// Функция возвращает заголовок по наименованию так, как это происходит в конфигураторе (точное соответствие)
// При этом есть возможность убрать префикс, чтобы заголовок формировался без него
// Правила преобразования:
//  0) удаляется префикс при необходимости (вместе с разделителем)
//  1) символ "_" заменяется пробелом, при этом лишние пробелы удаляются
//  2) первая буква становится прописной
//  3) перед всеми прописными буквами кроме первой ставится пробел
//  * если прописными буквы идут друг за другом более, чем 2 раза, то пробел ставится только перед первой
//  4) все прописные буквы кроме первой превращаются в строчные
//  * если прописные буквы идут друг за другом более, чем 2 раза, то регистр букв не меняется
//  * если прописная буква является единственным символом или находится в конце строки, то регистр букв не меняется
//
// Параметры:
//  Наим - Строка, имя написаное в стиле CamelCase с возможным указанием префикса (например, "дк_ОформитьДокументыПроизводства")
//  РазделительПрефиксаОтИмени - Строка, по данному разделителю удаляется префикс
//  КонкретныйПрефикс - Строка, если значение заполнено, то данный префикс ищется перед разделителем, и только тогда префикс удаляется
//Если значение не заполнено, то префикс определяется автоматически перед разделителем
//
Функция ПолучитьЗаголовокПоИмени(Наим, РазделительПрефиксаОтИмени = "_", КонкретныйПрефикс = "")

	ИмяБезПрефикса = Наим;
	Если НЕ ЗначениеЗаполнено(КонкретныйПрефикс) И ЗначениеЗаполнено(РазделительПрефиксаОтИмени) Тогда
		КонкретныйПрефикс = Лев(Наим, Найти(Наим, РазделительПрефиксаОтИмени) - 1);
	КонецЕсли;
	СтрокаПередКоторойВключаяУдалитьСимволы = КонкретныйПрефикс + РазделительПрефиксаОтИмени;
	Если ЗначениеЗаполнено(СтрокаПередКоторойВключаяУдалитьСимволы) Тогда
		НачалоНужнойСтроки = Найти(Наим, СтрокаПередКоторойВключаяУдалитьСимволы);
		Если Лев(Наим, СтрДлина(СтрокаПередКоторойВключаяУдалитьСимволы)) = СтрокаПередКоторойВключаяУдалитьСимволы Тогда
			ИмяБезПрефикса = Прав(Наим, СтрДлина(Наим) - СтрДлина(СтрокаПередКоторойВключаяУдалитьСимволы));
		КонецЕсли;
	КонецЕсли;

	Заголовок = "";
	ПредСимвол = "";
	Для Сч = 1 По СтрДлина(ИмяБезПрефикса) Цикл
		Символ = Сред(ИмяБезПрефикса, Сч, 1);
		Если Символ = "_" Тогда
			Символ = ?(ПредСимвол = Символы.НПП, "", Символы.НПП);
		КонецЕсли;
		Заголовок = Заголовок + Символ;
		ПредСимвол = ?(Символ = "", Символы.НПП, Символ);
	КонецЦикла;

	Заголовок = СокрЛП(Заголовок);

	ЗаголовокДоработанный = "";
	ПредСимволСтрочный = "";
	ПредПредСимволСтрочный = "";
	ПредСимвол = "";
	Для Сч = 1 По СтрДлина(Заголовок) Цикл
		Символ = Сред(Заголовок, Сч, 1);
		СледСимвол = ?(Сч + 1 <= СтрДлина(Заголовок), Сред(Заголовок, Сч + 1, 1), "");
		СледСимволСтрочный = ?(СледСимвол = ВРег(СледСимвол), СледСимвол, "");
		СледСледСимвол = ?(Сч + 2 <= СтрДлина(Заголовок), Сред(Заголовок, Сч + 2, 1), "");
		Если СледСимволСтрочный <> "" Тогда
			СледСледСимволСтрочный = ?(СледСледСимвол = ВРег(СледСледСимвол), СледСледСимвол, "");
		Иначе
			СледСледСимволСтрочный = "";
		КонецЕсли;
		СимволДляКонкатенации = Символ;
		БылРазрыв = Ложь;
		Если Сч > 1 И ВРег(Символ) = Символ И ПредСимвол <> Символы.НПП И Символ <> Символы.НПП 
		  И (СтрДлина(СледСимволСтрочный + СледСледСимволСтрочный + ПредСимволСтрочный + ПредПредСимволСтрочный) < 2
		   ИЛИ Нрег(ПредСимвол) = ПредСимвол) Тогда
		   
		   Если НЕ(СтрДлина(СледСимволСтрочный + ПредСимволСтрочный) > 0 И СледСимвол = "") Тогда
				ЗаголовокДоработанный = ЗаголовокДоработанный + Символы.НПП;
				БылРазрыв = Истина;
			КонецЕсли;
			СимволДляКонкатенации = ?(СтрДлина(СледСимволСтрочный + ПредСимволСтрочный) > 0 И (НЕ БылРазрыв ИЛИ СледСимволСтрочный <> ""), Символ, НРег(Символ));
			Если БылРазрыв И СледСимволСтрочный <> "" И СледСледСимволСтрочный = "" И СледСледСимвол <> "" Тогда
				СимволДляКонкатенации = НРег(СимволДляКонкатенации);
			ИначеЕсли СледСимвол = "" И БылРазрыв Тогда
				СимволДляКонкатенации = Символ;
			КонецЕсли;

		КонецЕсли;
		ЗаголовокДоработанный = ЗаголовокДоработанный + СимволДляКонкатенации;
		ПредПредСимволСтрочный = ?(ПредСимвол = ВРег(ПредСимвол), ПредСимвол, "");
		ПредСимвол = Символ;
		ПредСимволСтрочный = ?(Символ = ВРег(Символ), Символ, "");
	КонецЦикла;

	Возврат Врег(Лев(ЗаголовокДоработанный, 1)) + Сред(ЗаголовокДоработанный, 2);

КонецФункции
Показать
11. VyacheslavShilov 03.10.23 17:20 Сейчас в теме
(Мой вопрос закрыт:) Переделал - использовал подсистему БСП "Заполнение объектов" в расширении.
(В частности, по примерам:
- https://infostart.ru/1c/articles/949483/ ("Использование подсистемы БСП "Заполнение объектов");
- https://infostart.ru/1c/tools/903971/ ("Обработка заполнения объекта, вызов клиентского метода. Подключение через расширение")).
Оставьте свое сообщение
Вакансии
Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 130 000 руб. до 170 000 руб.
Полный день

Программист 1C
Санкт-Петербург
зарплата от 140 000 руб. до 200 000 руб.
Полный день