В УТ11.4 есть МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере, а в БП3.0 ?
Так же в УТ11.4 есть МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду, а в БП3.0 ?
А в БП нету. Рекомендую использовать ПодключаемыеКоманды.ПриСозданииНаСервере И ПодключаемыеКомандыКлиент.ВыполнитьКоманду. Естественно, захватывать их в расширение и использовать с инструкцией &После.
Пишет ошибку при нажатии на кнопку : {ОбщийМодуль.ПодключаемыеКоманды.Модуль(1372)}: Сведения о команде "КомандаTtt" не существуют. Не знаю как побороть.
&Вместо("ВыполнитьКоманду")
Процедура Расш1_ВыполнитьКоманду(Форма, Команда, Источник)
Если Команда.Имя = "КомандаTtt" Тогда
//Делаем что надо
Иначе
ПродолжитьВызов(Форма, Команда, Источник);
КонецЕсли;
КонецПроцедуры
Показать
Безопасный режим у расширения должен быть отключен.
(8) не понимаю, какие переменные? пример бы...
"Вместо" в случае (5) - это практически "Перед", только с проверкой условия - выполнять стандартный метод или нет.
Кто-нибудь может подсказать, как возможно в УНФ (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);
КонецФункции
(Мой вопрос закрыт:) Переделал - использовал подсистему БСП "Заполнение объектов" в расширении.
(В частности, по примерам:
- https://infostart.ru/1c/articles/949483/ ("Использование подсистемы БСП "Заполнение объектов");
- https://infostart.ru/1c/tools/903971/ ("Обработка заполнения объекта, вызов клиентского метода. Подключение через расширение")).