Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: ПолучитьФорму внешней обработки

Есть внешняя обработка("Форма"),в ней форма-"Форма".Подключенная через внешние формы и обработки/внешние обработки.
Код 1C
1
Форма = ВнешниеОбработки.ПолучитьФорму("Форма"),
Выдает ошибку:
Ошибка при вызове метода контекста (ПолучитьФорму)
Форма = ВнешниеОбработки.ПолучитьФорму("Форма");
по причине:
Ошибка подключения внешних метаданных
по причине:
Файл не обнаружен 'Форма'

Добавлено через 26 секунд
Помогите получить форму подключенную через внешние обработки

Добавлено через 6 минут
Конфигурация 1с 8.2.
Ответ: Логично, ибо платформа не в курсе, что за путь такой - "Форма".
Посмотрите, как происходит работа со внешними обработками в справочнике "Внешние обработки".
Если вкрадце, то необходимо получить имя временного файла, сохранить обработку в темпы с этим автоматически сформированным именем и уже потом только:
Код 1C
1
ВнешниеОбработки.ПолучитьФорму(<ИмяВременногоФайла>, "Форма");
ЗЫ. "Конфигурация 1с 8.2." - 8.2 - это платформа, а не конфа.
Вопрос: Получение макета печатной формы из внешней обработки

Всех приветствую!

Конфигурация: Управление небольшой фирмой, редакция 1.6 (1.6.5.28)

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

В этих функциях не хочет упорно получаться макет обработки функцией общего модуля: УправлениеПечатью.МакетПечатнойФормы("Обработка.ManifoldSetCP72.ПФ_MXL_Receipt");

выдает ошибку:
{ОбщийМодуль.ОбщегоНазначения.Модуль(2604)}: Неизвестный тип объекта метаданных "Обработка.ManifoldSetCP72"

только если так:
ПолучитьМакет("ПФ_MXL_Receipt");

Почему так, ведь общий модуль "Управление печатью" серверный!?
Ответ:
Все понял, это функция ищет макеты в регистре сведений или в общих макетах!
Всем спасибо!
Вопрос: Обработка заполнения справочника контрагентами из эксель

Добрый день. Пишу обработку по УТ 10,3. Задача такова-из имеющегося xml документа перенести контрагентов-покупателей в базу ут.
В обработке прописал процесс считывания данных из экселя... Затем помещаю данные в ТабЗнач и выношу на форму, чтоб проверить, всё ли считалось... Как сделать процедуру по считыванию данных из ТабЗнач и обработку этих данных? Начал писать функцию по созданию нового элемента справочника, но необходимо ссылаться на табзнач для получения значений...

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Процедура ПрочитатьНажатие(Элемент)
        
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        
    Попытка 
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();   
        Excel = 0;
        Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;   
    
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 27);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
    
     //создание колонок табличного документа  
    ТабЗнач = Новый ТаблицаЗначений;
    ТабЗнач.Колонки.Добавить("Завод"); 
    ТабЗнач.Колонки.Добавить("Имя"); 
    ТабЗнач.Колонки.Добавить("НазваниеФирмы");
    ТабЗнач.Колонки.Добавить("КППОбъекта");
    ТабЗнач.Колонки.Добавить("КодРегиона"); 
    ТабЗнач.Колонки.Добавить("Регион"); 
    ТабЗнач.Колонки.Добавить("ПИндекс");
    ТабЗнач.Колонки.Добавить("Город");
    ТабЗнач.Колонки.Добавить("Улица");
    ТабЗнач.Колонки.Добавить("НомерДома");
    ТабЗнач.Колонки.Добавить("Дополнение");
    ТабЗнач.Колонки.Добавить("Телефон");
    
    //считываем первую строку и генерируем колонки
    Для НС = 2 По ФайлСтрок Цикл 
        НоваяСтрока = ТабЗнач.Добавить();
        НоваяСтрока.Завод = Excel.Cells(НС, 1).Value;
        НоваяСтрока.Имя = (Excel.Cells(НС, 2).Value); //проверка на наличие контрагента. Это грузополучатели    
        НоваяСтрока.НазваниеФирмы = (Excel.Cells(НС, 4).Value); //это контрагенты - плательщики
        НоваяСтрока.КППОбъекта = Excel.Cells(НС, 9).Value;
        НоваяСтрока.КодРегиона = Excel.Cells(НС, 12).Value;
        НоваяСтрока.Регион = Excel.Cells(НС, 13).Value;
        НоваяСтрока.ПИндекс = Excel.Cells(НС, 14).Value;
        НоваяСтрока.Город = Excel.Cells(НС, 15).Value;
        НоваяСтрока.Улица = Excel.Cells(НС, 16).Value;
        НоваяСтрока.НомерДома = Excel.Cells(НС, 17).Value;
        НоваяСтрока.Дополнение = Excel.Cells(НС, 18).Value; //проверять на наличие
        НоваяСтрока.Телефон = Excel.Cells(НС, 19).Value;
    КонецЦикла;
          
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
     
     //поместить считанные данные в форму обработки
     ЭлементыФормы.Таблица.Значение = ТабЗнач;
     ЭлементыФормы.Таблица.СоздатьКолонки();
     
     
     
 КонецПроцедуры
PS. Стандартная обработка не подходит, уже выяснил опытным путём...
Ответ: Nenaviju1C, Всё, разобрался)))
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
КонецПроцедуры
 
Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
    
    Если ДиалогВыбора.Выбрать() Тогда
        ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
    КонецЕсли;
    
КонецПроцедуры
 
Процедура ПрочитатьНажатие(Элемент)
        
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        
    Попытка 
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();   
        Excel = 0;
        Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;   
    
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 27);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
    
     //создание колонок табличного документа  
    ТабЗнач = Новый ТаблицаЗначений;
    ТабЗнач.Колонки.Добавить("Завод"); 
    ТабЗнач.Колонки.Добавить("Имя"); 
    ТабЗнач.Колонки.Добавить("НазваниеФирмы");
    ТабЗнач.Колонки.Добавить("КППОбъекта");
    ТабЗнач.Колонки.Добавить("КодРегиона"); 
    ТабЗнач.Колонки.Добавить("Регион");     
    ТабЗнач.Колонки.Добавить("ПИндекс");
    ТабЗнач.Колонки.Добавить("Город");
    ТабЗнач.Колонки.Добавить("Улица");
    ТабЗнач.Колонки.Добавить("НомерДома");
    ТабЗнач.Колонки.Добавить("Дополнение");
    ТабЗнач.Колонки.Добавить("Телефон");
    
    //считываем первую строку и генерируем колонки
    Для НС = 2 По ФайлСтрок Цикл 
        НоваяСтрока = ТабЗнач.Добавить();
        НоваяСтрока.Завод = Excel.Cells(НС, 1).Value;
        НоваяСтрока.Имя = (Excel.Cells(НС, 2).Value); //проверка на наличие контрагента. Это грузополучатели    
        НоваяСтрока.НазваниеФирмы = (Excel.Cells(НС, 4).Value); //это контрагенты - плательщики
        НоваяСтрока.КППОбъекта = Excel.Cells(НС, 9).Value;
        НоваяСтрока.КодРегиона = Excel.Cells(НС, 12).Value;
        НоваяСтрока.Регион = Excel.Cells(НС, 13).Value;
        НоваяСтрока.ПИндекс = Excel.Cells(НС, 14).Value;
        НоваяСтрока.Город = Excel.Cells(НС, 15).Value;
        НоваяСтрока.Улица = Excel.Cells(НС, 16).Value;
        НоваяСтрока.НомерДома = Excel.Cells(НС, 17).Value;
        НоваяСтрока.Дополнение = Excel.Cells(НС, 18).Value; //проверять на наличие
        НоваяСтрока.Телефон = Excel.Cells(НС, 19).Value;
    КонецЦикла;
          
     // Закрыть COM соединение для экономии памяти
     Excel.Application.Quit();
     
     //поместить считанные данные в форму обработки
     ЭлементыФормы.Таблица.Значение = ТабЗнач;
     ЭлементыФормы.Таблица.СоздатьКолонки();
     
     мФорма = ПолучитьФорму (Справочники.Контрагенты.ПолучитьФормуНовогоЭлемента());
     СозданиеКонтрагента(мФорма);
     
 КонецПроцедуры
 
 
 Процедура СозданиеКонтрагента (мФорма)
     
     Для Каждого СтрокаТаблицы из Таблица  Цикл
      НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
      НовыйОбъект.Наименование = СтрокаТаблицы.НазваниеФирмы;
      НовыйОбъект.НаименованиеПолное = СтрокаТаблицы.НазваниеФирмы;
      НовыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
      НовыйОбъект.КПП = СтрокаТаблицы.КППОбъекта;
      НовыйОбъект.Покупатель = Истина;
        Попытка
           НовыйОбъект.Записать();
       Исключение
           Продолжить;
        КонецПопытки; 
        
      
    КонецЦикла;
      
     
 КонецПроцедуры
Справочник заполнился, но только у каждого контрагента 1я страница.. теперь надо думать. как остальные запонять. Хотя по факту нужно допилить заполнение адресов с проверкой по классификатору
Вопрос: Застрял с правами на обработку

Ребята, хелп, плиз!

Есть УТ11.
Есть обработка состояние обеспечения.
Есть менеджер. У менеджера урезанные права.

Задача: дать права менеджеру на обработку Состояние обеспечения заказов.

Голову сломал, не выходит дать так, чтобы не пооткрывать лишнего.

Суть в чём:
Обработка входит в подсистему "Продажи/Оптовые продажи". В командном интерфейсе вижу её в разделе "Панель действий: Сервис".
У менеджера в роли есть доступ к обработке - она открывается, например, из Всех функций.
У менеджера есть право на подсистему Продажи и "Продажи/Оптовые продажи".
В форме настройки командного интерфейса подсистемы у обработки по-умолчанию включена видимость.

Запускаю программу под менеджером - нету обработки в интерфейсе.
Ну, думаю, мало ли, скрыта - Правая кнопка - Настройка панели действий: нету.
Вот где она? Права доступа к чему могут влиять на её видимость?

Под своими полными правами я, понятно, вижу обработку в нужном месте интерфейса: в панели действий подсистемы Продажи в категории Сервис.
Ответ: Смотрите права и на команды обработки
Вопрос: Программное открытие внешних обработок.

Добрый всем день.
Возникла неоднозначная ситуация.
Платформа 1С 8.3.10. Конфигурация на обычных формах.
Есть программный код, в процессе выполнения которого запускается внешняя обработка, находящаяся в файловой системе компьютера.
Проблема в том, что после обновления платформы, если изменить обработку, она перестает запускаться.
Очевидно, старая версия "запомнилась" 1С-ке, как разрешенная для запуска обработка. А обновленная не имеет разрешения на запуск. К тому же 1С не запрашивает разрешения пользователя, как это сейчас делают последние конфигурации.
В конфигурации отсутствует роль "Интерактивное открытие внешних обработок" (она довольно старая, да).
Я так понимаю, это функционал платформы, взаимодействие с которым работает через роль. И, в случае её отсутствия, разрешения просто нет.
Есть ли возможность интерактивно выдавать разрешение на запуск/настроить право на запуск без роли? Или вариант только один - откатывать платформу?

Заранее спасибо!
Ответ: Итого, варианты решения, которые я смог найти:
1) Стандартное решение проблемы - дать пользователю 1С разрешение через роль "Интерактивное открытие внешних обработок". Но если конфигурация клиента слишком старая, этой роли там может не быть.
2) Дать пользователю разрешение на уровне платформы через конфигуратор ().
3) Дать разрешение на программном уровне при вызове обработки:
Параметр "ЗащитаОтОпасныхДействий" метода "Подключить()" для менеджера внешних обработок (отчетов).
4) В файле C:\Program Files (x86)\1cv8\conf\conf.cfg, если есть строка "SystemLanguage=System" добавить "DisableUnsafeActionProtection=.*" (вместо "*" можно указать пути к конкретным базам 1С).
Вопрос: Создал внешнюю обработку, а добавить не могу...

Всем привет! Сделал внешнюю обработку к УправлениюТорговлей 11.2, через Файл-Открыть все работает, попытался вставить ее через функционал "Дополнительные обработки", программа выдала ошибку "Невозможно подключить дополнительную обработку из файла. Возможно, она не подходит для этой версии программы. Метод объекта не обнаружен (СведенияОВнешнейОбработке)". Погуглил тему, нашел кусок кода который нужно вставить в обработку. Вставил, загружаю - ошибка та же самая... Что не так делаю?
Код к моей обработке:
Код:
Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");

    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Возврат с комиссии для продажи");
    ПараметрыРегистрации.Вставить("Версия", "1.14");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация",
        "Заполнение ТЧ документа РеализацияТоваровУслуг из товара, отданного на комиссию этому контрагенту." + Символы.ПС
        + "Автоматическое открытие формы документа ВозвратТовараОтКлиента и его заполнение." + Символы.ПС
         + "Версия 1.1  -- возможность работать с общими упаковками." + Символы.ПС
         + "Версия 1.11 -- группировка товара по ном. и хар. в дин. списке." + Символы.ПС
         + "Версия 1.12 -- Документ ""Возврат товара"" не сохраняется, но открывается и заполняется его форма" + Символы.ПС
        + "(workaround для ошибки установки привилегированного режима при записи документа). " + Символы.ПС
         + "Версия 1.13 -- Упаковку ищем теперь по единице измерения ""упак""" + Символы.ПС
        +"Версия 1.14 - Дата у документа ""Возврат товара"" устанавливается на одну секунду меньше даты документа реализации"+Символы.ПС
    );
   
    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд,
        "Возврат товара с комиссии",
        "0",
        "ОткрытиеФормы",
        Истина
    );

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Ответ:
Нашел материал, изучил - получилось построить все как надо. Переписал обработку заново, не создавал в ней ни форм, ни реквизитов. Но! СсылкаНаОбъект - реально работает )))) Я думаю что в этой функции это как-то сработало
Код:
Функция ПечатьФормы(СсылкаНаОбъект,ОбъектыПечати)
ТабДок = новый ТабличныйДокумент;
  Макет = ПолучитьМакет("МойМакетище");
  ОбластьЗаголовок  = Макет.ПолучитьОбласть("Заголовок");
  ОбластьПоставщик = Макет.ПолучитьОбласть("Поставщик");
....
   ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Товарный чек №"+СсылкаНаОбъект.Номер+" от "+СсылкаНаОбъект.Дата;
   ТабДок.Вывести(ОбластьЗаголовок);
....
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
  ОбластьТовар.Параметры.НомерСтроки = ТекущаяСтрока.НомерСтроки;
  ....
 ТабДок.Вывести(ОбластьТовар);

КонецЦикла;
....
   ТабДок.АвтоМасштаб=истина; // уместить на одну страницу
   ТабДок.ТолькоПросмотр=истина;
   ТабДок.ОриентацияСтраницы=ОриентацияСтраницы.Портрет;
   ТабДок.ОтображатьСетку=Ложь;

возврат ТабДок;
КонецФункции
Вопрос: Сохранение настроек внешних обработок

Требовалось сделать 2 похожих обработки (неуправляемые формы, одна создает приходники, другая - расходники) и это было сделано. Вопрос в другом. После того, как я сделал одну из них, я скопировал её, доработал и таким образом получилась вторая обработка. Требуется сохранять настройки (реквизиты формы). Имена файлов а также имена самих обработок различаются, однако у них "общие" настройки - после сохранения настроек в первой, вторая при восстановлении настроек получает их от первой, вместо того, чтоб восстанавливать свои и наоборот.
Ну и, очевидно, хочу знать ответы на вопросы:
1) Как сделать, чтоб настройки у каждой обработки были свои?
2) Почему так получается? Как теоретически объяснить это? Я раньше думал, что настойки связаны (кроме пользователя) с именем обработки/отчета или именем файла, но оказалось, что это не так. С чем же они связаны?
Ответ: ОК, но что изменить в объекте, чтоб отвязать настройки? У объекта, как реквизита формы, не так много есть чего менять вообще )) можно стандартное имя (ОбработкаОбъект) как-нить переназвать...
На самом деле, я уже решил проблему - скопировал поочерёдно реквизиты, ТЧ, форму, текст модуля объекта в пустую обработку - настройки у неё теперь свои. Но хотелось бы всё равно понять почему так получается.
Вопрос: Защита кода конфигураций и обработок в 1С8х

Защита кода конфигураций и обработок в 1С8х

Введение

В «восьмерке», также как и в «семерке» защита исходного кода штатными средствами не является достаточно надежной. В Интернете можно найти способы и средства для взлома защищенных конфигураций 1С. Относительно легко снять пароли на вход, как в режим «Предприятие», так и режим «Конфигуратор», а в версии 1С8х, где вместо исходного кода можно оставить только интерпретируемый байт-код, имеется возможность декомпилировать псевдокод в исходное состояние, хотя и без сопутствующих, первоначально, комментариев.

Однако в большинстве случаев штатных средств 1С вполне достаточно для «защиты от дурака». Проблема возникает, когда существует необходимость защитить конфигурации от специалистов, заинтересованных во взломе, например, при распространении полнофункциональных демо-версий через Интернет. Поэтому если возникает потребность в использовании серьезной защиты, то необходимо применение нештатных средств. Те, кто уже заработал достаточно средств на своих программах, может использовать коммерческие решения от сторонних фирм, но для тех, кто только планирует разместить свои конфигурации, да еще на бесплатных сайтах, платить за защиту программ, которые не факт, что окупятся, не всегда есть возможность. Конечно, многие предложат выкладывать собственные программы безо всякой посторонней защиты, если они еще достаточно сырые, однако у авторов разработок на этот счет могут быть иные мнения.

Другой вариант, это попытаться применить собственные нештатные средства, тем более что такое нередко встречается на практике. Применительно, к восьмой версии 1С задача может быть сформулирована более конкретно. Как самостоятельно защитить от декомпиляции байт-код 1С8х, так чтобы это не повлияло на работу интерпретатора данного псевдокода? Иначе говоря, как сделать, чтобы пи-код был легальным с точки зрения интерпретатора и нелегальным с точки зрения декомпилятора?

Немного теории

Известно, что языки высоко уровня (ЯВУ) делятся, по способу выполнения своего кода, на две большие группы: интерпретируемые и компилируемые. Интерпретатор выполняет промежуточный, предварительно оттранслированный код, который затем преобразуется в непосредственный код процессора, а компилятор готовит родной машинный код в виде исполнимого файла, для выполнения его средствами операционной системы. Здесь важно отметить тот факт, что декомпиляция бинарного кода хотя и возможна, но уровень декомпиляции (код ассемблера либо жалкое подобие языка Си) практически не позволяет эффективно использовать декомпилированую программу целиком. Зато промежуточный байт-код любых интерпретируемых языков относительно легко восстанавливается в исходный вид. Достаточно вспомнить про декомпиляторы Visual FoxPro, Java, Adobe Flash и т.п.

Таким образом, перед нами стоит задача, если не защитить от декомпиляции байт-код 1С (что довольно трудно сделать без посторонних средств), то хотя бы максимально затруднить восстановление кода и его осмысление. Первое, что приходит на ум это обфускация или запутывание и усложнение кода для понимания и восстановления. И действительно, данный метод широко используется в защите конфигураций и обработок 1С, например, AWA ( ) таким образом защищает собственные обработки вроде, Декомпилятор1Сv8.epf, что подтверждается его словами: «если выдается сообщение, что "Возможно, модуль обфусцирован", в 99.9 процентах случаев модуль действительно обфусцирован. Обфускаторов байт-кода существует много, самый известный - WiseAdvice. После некоторых обфускаторов кода можно восстановить корявый текст, однако в открытом доступе таких средств на данный момент нет.» ( ). Тем не менее, он ничего не говорит о принципах самой обфускации, хотя для своих разработок он использует собственную обфускацию.

Чисто теоретически принципы обфускации сформулировать нетрудно. Это:

1. Замена осмысленных пользовательских имен переменных, меток, функций и т.п. на бессмысленные.

2. Удаление форматирование текста, т.е. представление всего кода программного модуля в виде одной длиной строки. Хотя на самом деле это слабая защита, достаточно поставить символы перевода строк после каждой точки с запятой. Легко добавить и другие автоматические средства восстановления форматирования кода.

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

4. Замена простого и естественного кода на более сложный и менее понятный эквивалентный код. Например, все операторы выбора и циклов заменить сложными условными и безусловными переходами. Причем, за счет злоупотребления оператором «Перейти ~Метка;» можно строить чрезвычайно запутанный и малопонятный код.

Данные принципы действуют на уровне ЯВУ. Но можно предложить достаточно эффективный метод, на уровне байт-кода, который заведомо положит на лопатки любой декомпилятор, пытающийся восстановить исходный код. Этот метод мы назовем методом «мусорных ям». Принцип его действия прост. Нужно, с помощью блоковых операторов, таких как операторы выбора, циклов, попытки- исключения, неиспользуемых процедур и функций, операторов безусловного перехода и т.п. сформировать области кода, которые заведомо не получит управление. Например, как в операторе вида:
Если Ложь Тогда
// «Мусорный» код
КонецЕсли;

Естественно, что это может быть реализовано менее явным образом. Затем в полученном байт-коде заменяем легальные команды мусорного кода на произвольный байт-код, например, нелегально используем легальный код, скажем, применяем стековые команды к пустому стеку, либо к чужим данным. Либо заменяем исходный байт-код на нелегальный или несуществующий псевдокод, который заведомо обрушит любой декомпилятор, пытающийся выполнять команды на уровне формы (заметим, что интерпретатор выполняет пи-код на уровне его содержания). А поскольку интерпретатор никогда не получит управление на ложный байт-код, то он никогда об него и не споткнется. Зато, декомпилятор, пытающийся восстанавливать весь код, сломает себе шею на бессмысленных командах. Его типичные сообщения при этом будут: «Выход за пределы стека либо индексов массивов» и «Несуществующая либо невыполнимая команда псевдокода». И действительно подобные сообщения выдает декомпилятор 1С от Авы, когда с его помощью пытаются декомпилировать его самого либо обфусцированный как надо исходный код. Таким образом, нас вполне устраивает подобный уровень защиты, который хотя и не абсолютный, зато может быть бесплатным и отсечь достаточный процент недобросовестных пользователей. Ну а от суперхакеров и профессиональных взломщиков защищаться особого смысла нет, эти ребята достанут и чёрта лысого из его нычки.

Как правило, из любой нетривиальной идеи всегда можно получить нетривиальные выводы. Посмотрим, что нас ожидает в нашем случае. Первое, мы пришли к пониманию, что есть два вида интерпретаторов, одни выполняет команды на основе их содержания, а другие на основе их формы. Например, условные команды на уровне содержания:
a
123
=

присвоят переменной a числовое значение 123. А те же команды на уровне формы вернут строку текста: «a = 123». Т.е., в первом случае мы получаем числовую переменную, а во втором конкретную строку. Это различие, в принципе естественное, но не очевидное. Кстати, рассматриваемые нами декомпиляторы являются интерпретаторами формы. А интерпретатором содержания будет интерпретатор байт-кода 1С.

Второе, данный метод защиты годится не только для интерпретируемого кода, но и для компилируемого. Действительно, размещая в уже скомпилированном коде, в областях закрытых для управления (помеченных заранее известным мусорным кодом), бессмысленный код, мы положим на лопатки любой декомпилятор или лучше сказать дизассемблер, даже такой как IDA PRO. Т.е. дизассемблерный листинг мы, скорее всего, получим, но местами абсолютно бессмысленный и не доступный для получения на его основе хотя бы более-менее осмысленного псевдосишного кода. Иначе говоря, трудную жизнь любителям восстанавливать бинарный код на уровне ассемблера, можно еще более усложнить. Возможно, я вернусь к этой теме в отдельной статье (достаточно будет привести простой код на ассемблере, бинарный вариант которого приведет IDA PRO в ступор, а его плагин по получению псевдо Си-кода не даст ничего путного).

Итак, путем несложных рассуждений мы пришли к пониманию, как можно бесплатно защитить свой код в 1С8х, хотя бы на уровне Авы. Для этого пишем собственный двухуровневый (ЯВУ и байт-код) обфускатор по сформулированным выше принципам. При этом можно применять разные степени усложнения и запутывания. Причем байт-код 1С (после исключения текста модулей из поставки конфигурации) можно менять как штатными средствами, путем выгрузки конфигурации в xml-файлы, в последних версиях «восьмерки», так и нештатными, вроде V8Unpack. Данный метод относительно несложен и позволяет использовать собственные трюки и маленькие секреты.

Однако следует сказать, что знание защиты позволяет использовать и пути ее обхода. В нашем случае, для того, чтобы не вызывать жалобы декомпилятора при пережевывании им обфусцированного псевдокода, нужно вообще отказаться от использования, в нашем понимании, интерпретатора формы, другими словами, стековой или Форт-машины. Иначе говоря, ограничится только дешифровкой команд и данных либо попытаться вместо стекового интерпретатора использовать некий синтаксический анализатор. Но последний должен уже обладать зачатками искусственного интеллекта, что наверняка вызовет избыточные трудности при программировании. Поэтому, самый простой вариант обхода защиты обфусцированного байт-кода это просто расшифровать его команды и данные и анализировать полученный полуфабрикат уже вручную. Конечно, это будет уже удовольствие на любителя, ведь при должной двухуровневой обфускации анализировать полученный результат будет непросто.

Вот пример попытки частичного восстановления обфусцированого байт-кода обработки Авы:
{Процедура e3(оо, эw, Var0д)}
    {Cmd_12225:}
    {сд}{Неопределено}{=}
    {Var6е}{."БазовыйТип"}{зш}{==}
    {хщ}{41,1314}
    {Cmd_12234:}
    {=}
    {Неопределено}{=}
    {хщ}{41,10520}
    {Cmd_12242:}
    {Функция:5}{пj()}{=}
    {Var6е}
    {Go Cmd_11302}
    {Cmd_12248: # Cmd_12248:}
    {сt}{оо}{Функция:2}{r0()}{Var0д}{че}
    {ElseGo Cmd_1671}
    {Cmd_12255:}
    {КонецЦикла}
. . .


Как видим, здесь чёрт ногу сломит, поэтому на таком уровне пусть изучают наш код, сколько угодно.

Заключение

По идее мы должны были в данной статье предоставить собственной вариант программы по защите кода 1С. Но поскольку подобная задача только встала перед нами, то требовалось сначала разобраться с руководящими принципами. Теперь, когда стало ясно в каком направлении двигаться, можно заняться непосредственно программой, хотя ее принципы, как нам кажется, достаточно интересны сами по себе, чтобы начать их обсуждение до получения конкретного результата. Поэтому встречные рассуждения и конструктивная критика приветствуются.
Ответ:
Zerro
Программист 1с
Вдогонку сайты продающие обработки 1с не имеют права на существование или это нормальная бизнес модель?

ты у нихъ покупал? я нет..мне пофиг -пусть живут
Нет не покупал. Но раз они существуют - значит кому-то надо.

ps Подозревают что вся проблема из-за недостаточной защищенности средствами 1с. Было бы нормально - не было бы споров.
Вопрос: Проблема при написании своей обработки.

Здравствуйте. Пишу обработку под УТ 1.3. Задача состоит в подгрузке накладной поставщика в Документ поступление Товаров и Услуг. Возникла проблема, если помните, в ФормеДокумента в верхнем левом углу есть кнопка "Цены и валюта", при нажатии на которую открывается одноименное окно, так вот после того как документ сформирован обработкой жму на эту кнопку, дабы подставить вручную необходимые значения и натыкаюсь на такую проблему:

Т.е. получается, что "0 руб. = 1 руб."
При проведении документа выскакивает ошибка:
"Не заполнено значение реквизита "Кратность взаиморасчетов"!"
При этом следует учесть, что когда я вручную создаю новый документ, то в нем все нормально "1 руб. = 1 руб."
Как быть, кто знает?
Ответ:
А подскажите, в какой обработке нужно писать "Док.КратностьВзаиморасчетов = 1". В групповой обработке справочников и документов?
Вопрос: Проблема с добавлением обработки

Платформа 8.3.7.1759, Бухгалтерия п/п 3.0.41.57 файловая.

Внешняя обработка заполнения ТЧ, один вариант которой я успешно протестировал. Создал второй вариант, который теперь не могу загрузить в базу - программа ищет файл первой обработки, не находит, и ругается:
"Невозможно подключить дополнительную обработку из файла.
Возможно, она не подходит для этой версии программы.
Файл не обнаружен 'C:\Programs\1C\мояобработка1.epf'"

Также не загружаются все другие обработки, которые раньше нормально загружались и работали.

Загружается только "мояобработка1.epf", причем только в том случае, если её файл лежит в первоначальном расположении.

Чистил кэш, переподключал базу, даже платформу переустановил, раньше 8.3.6 была.

Вот, что за странная и нелепая проблема, как побороть?
Ответ:
ага есть такая тема.. проблема скорее всего в идентификации, загрузите вторую обработку в конфигурацию и выгрузите обратно, и попробуйте загрузить как внешнюю. Не буду искать в чем причина, была такая проблема гуглил решалось вот таким образом.