Имя: Пароль:
1C
 
Расширение, перед, изменение параметра процедуры
0 YaFedor
 
11.07.25
14:57
Имеем процедуру:

ИзменитьДанные(ПараметрСтруктура) Экспорт в общем модуле.

Берем этот модуль в расширение и делаем процедуру расширенную:

&Перед("ИзменитьДанные")
ИзменитьДанные(ПараметрСтруктура) Экспорт

в которой ПараметрСтруктура.ОбрабатыватьДанные = Ложь;


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

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

Т.е. нельзя расширением перед поменять параметры процедуры?
1 Ненавижу 1С
 
гуру
11.07.25
15:03
(0) можно, но угадать, что ты там делаешь, без кода нельзя
2 YaFedor
 
11.07.25
15:09
(1) Вот код процедуры "Перед"

Процедура DO00001_ВставитьШтрихкодПродолжение_Расширенная_Перед(НастройкиПоложенияШК, Параметры) Экспорт
	
	
	Перем лРазрешеноВставлятьШтрихКодВручную;
	Перем лЭтоАвтоматическаяВставка;
	Перем лФайлРедактируется;

	ТекущиеДанные 			= Параметры.ТекущиеДанные;
	ТекущийФайл 			= Параметры.ТекущийФайл;
	ДанныеОШтрихкодеФайла 	= Параметры.ДанныеОШтрихкодеФайла;

	лРазрешеноВставлятьШтрихКодВручную	= DO00001_ШтрихКодированиеСервер.РазрешеноВставлятьШтрихКодВручнуюВФайл(ТекущийФайл); 
	лЭтоАвтоматическаяВставка			= DO00001_ШтрихКодированиеСервер.ЭтоАвтоматическаяВставка(ДанныеОШтрихкодеФайла); 
	
	// Если  ручная вставка и запрещено, то просто укажем, что файл редактируется.
	Если лЭтоАвтоматическаяВставка Тогда
	Иначе
		Если лРазрешеноВставлятьШтрихКодВручную Тогда
		Иначе
			ДанныеОШтрихкодеФайла.ФайлРедактируется = Истина;	
		КонецЕсли;
	КонецЕсли;
	
		
КонецПроцедуры
3 YaFedor
 
11.07.25
15:10
+
Исходный код процедуры:

Процедура ВставитьШтрихкодПродолжение(НастройкиПоложенияШК, Параметры) Экспорт
    
    ТекущиеДанные = Параметры.ТекущиеДанные;
    ТекущийФайл = Параметры.ТекущийФайл;
    ДанныеОШтрихкодеФайла = Параметры.ДанныеОШтрихкодеФайла;
    
    Если НастройкиПоложенияШК = Неопределено Тогда    
        Возврат;
    КонецЕсли;
    
    Если ТекущиеДанные.Расширение = "doc" Тогда
        #Если НЕ ВебКлиент Тогда
            Если ДанныеОШтрихкодеФайла <> Неопределено
                И ДанныеОШтрихкодеФайла.Свойство("ДвоичныеДанныеФайла")
                И (НастройкиПоложенияШК.ВысотаШК <> ДанныеОШтрихкодеФайла.НастройкиШтрихкода.ВысотаШК
                ИЛИ НастройкиПоложенияШК.ПоказыватьЦифры <> ДанныеОШтрихкодеФайла.НастройкиШтрихкода.ПоказыватьЦифры) Тогда
                ДанныеОШтрихкодеФайла.ДвоичныеДанныеИзображения =
                    ШтрихкодированиеСервер.ПолучитьКартинкуШтрихкода(ДанныеОШтрихкодеФайла.Штрихкод,, НастройкиПоложенияШК.ВысотаШК, НастройкиПоложенияШК.ПоказыватьЦифры).ПолучитьДвоичныеДанные();
            КонецЕсли;
            
            Состояние(НСтр("ru = 'Выполняется вставка штрихкода в файл.
                |Пожалуйста, подождите...'"));
                
            Если ДанныеОШтрихкодеФайла <> Неопределено И ДанныеОШтрихкодеФайла.Свойство("ДвоичныеДанныеФайла") Тогда
                Результат = ШтрихкодированиеКлиентСервер.ВставитьШтрихкодСИспользованиемНастроек(ТекущийФайл,
                    НастройкиПоложенияШК,
                    Истина,
                    ДанныеОШтрихкодеФайла.ДвоичныеДанныеИзображения,
                    ДанныеОШтрихкодеФайла.ДвоичныеДанныеФайла,
                    ДанныеОШтрихкодеФайла.Расширение,
                    ДанныеОШтрихкодеФайла.ФайлРедактируется,
                    ДанныеОШтрихкодеФайла.ИзменениеФайловMSWordТолькоНаСервере);
            Иначе
                Результат = Ложь;
            КонецЕсли;
                
            Если НЕ Результат Тогда
                Результат = ШтрихкодированиеСервер.ВставитьШтрихкод(ТекущийФайл, ДанныеОШтрихкодеФайла);
            КонецЕсли;
            Состояние();
        #Иначе
            Состояние(НСтр("ru = 'Выполняется вставка штрихкода в файл.
                |Пожалуйста, подождите...'"));
            Результат = ШтрихкодированиеСервер.ВставитьШтрихкод(ТекущийФайл, ДанныеОШтрихкодеФайла);
            Состояние();
        #КонецЕсли
    Иначе
        Результат = ШтрихкодированиеСервер.ВставитьШтрихкод(ТекущийФайл, ДанныеОШтрихкодеФайла);
    КонецЕсли;

    Если Результат Тогда
        Текст = НСтр("ru = 'Изображение штрихкода успешно вставлено в файл!'");
        
        ФайлСсылка = ТекущийФайл;
        Оповестить(
            "Запись_Файл",
            Новый Структура("Событие, Файл, Владелец, ЕстьЗашифрованныеИлиЗанятыеФайлы, ИдентификаторРодительскойФормы",
                "ДанныеФайлаИзменены",
                ФайлСсылка, Неопределено, Неопределено,
                Неопределено),
                ФайлСсылка);
        
    Иначе
        Текст = НСтр("ru = 'Не удалось вставить изображение штрихкода в файл'");
    КонецЕсли;
    
    ПоказатьПредупреждение(, Текст);
    
КонецПроцедуры
4 maxab72
 
11.07.25
15:27
(2) ДанныеОШтрихкодеФайла - это локальная переменная?
5 YaFedor
 
11.07.25
15:44
(4) Да, локальная переменная процедуры

Параметры - это структура,
ДанныеОШтрихкодеФайла - тоже структура
6 maxab72
 
11.07.25
15:53
(5) и как тогда процедура ВставитьШтрихкодПродолжение узнает, что там что-то поменяли?
7 YaFedor
 
11.07.25
15:56
Вечер пятницы - это не время для работы.

Я тупанул, структура это же не таблица значений и присваивание - это не ссылка.