Имя: Пароль:
1C
1С v8
Создание внешней обработки заполнения табличных частей в управляемом приложении
0 Slepoi7
 
25.12.14
09:44
// ----- модуль объекта ------
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
    ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Наименование", "Заполнить табличную часть "+ПараметрыРегистрации.Версия);
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части к документу РеализацияТоваровУслуг");
    ТипСтрока = Новый ОписаниеТипов("Строка");
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", ТипСтрока);
    Команды.Колонки.Добавить("Идентификатор", ТипСтрока);
    Команды.Колонки.Добавить("Использование", ТипСтрока);
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор",   ТипСтрока);
       НоваяКоманда = Команды.Добавить();
       НоваяКоманда.Представление = "Заполнить табличную часть = "+ПараметрыРегистрации.Версия;   // отображается в меню!!!
       НоваяКоманда.Идентификатор = "Заполнить табличную часть "+ПараметрыРегистрации.Версия;
       НоваяКоманда.Использование = "ОткрытиеФормы";
       НоваяКоманда.ПоказыватьОповещение = Истина;
       //НоваяКоманда.Модификатор = "ПечатьMXL";
       НоваяКоманда.Модификатор = "";
    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
КонецФункции
  // ------ модуль формы ----
&НаКлиенте
Процедура Кн1(Команда) // вот тут бы надо корректировать              табличную часть,... не могу подобраться к документу ....
  // ..........
   //    Заполнить(1);
КонецПроцедуры

   ==== Что делать ??? ====
1 hawksib
 
25.12.14
10:01
зачем тебе процедура кн1, которая нигде не вызывается? че ты хочешь?
2 Slepoi7
 
25.12.14
10:09
Как зачкм ? ак как же по другому ? Когда я вызываю документ, нажимаю кнопку "Заполнить" и из выпадающего меню вызываю свою процедуру (форму), с помощью которой хочу занести свои данные с своём формате в табличную часть этого документа....
3 banco
 
25.12.14
10:10
(0) что делать? прочитать документацию, посмотреть примеры
4 Slepoi7
 
25.12.14
10:10
... а процедура Кн1 - это кнопка на теле формы, что вызывается....
5 hawksib
 
25.12.14
10:11
если кн1 это то, о чем я догадываюсь, а именно сама процедура по обраотке табличной части, тогда попробуй заменить "ОткрытиеФормы" на "ВызовКлиентскогоМетода", создать форму и напиши в ней
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    //Спросим у пользователя разрешение на продолжение обработки
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = "Текущие данные документа(ов) будут заменены новыми без возможности восстановления.
    |Продолжить?";
    Ответ = Вопрос(Текст, Режим, 0);
    Если Ответ = КодВозвратаДиалога.Да Тогда

        //Если пользователь дал разрешение на продолжение, то начнем перебирать все
        //документы, у которых мы планируем заполнить табличную часть
        Для каждого Элемент из ОбъектыНазначенияМассив Цикл
            //Зададим ключ поиска документа, из которого вызвана данная обработка,
            //чтобы получить ссылку на редактирумый документ в удобном виде для
            //функции ОткрытьФорму()
            КлючПоиска = Новый Структура("Ключ", Элемент);

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

                    //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
                    //В объекте содержатся все реквизиты (элементы) формы
                    НовыйОбъект = Форма.Объект;

                    //Мы помещаем объект формы в переменную,
                    //так как должны передать её в процедуру на сервере,
                    //где нельзя изменять объект формы, зато можно править переменную содержащую его
                    ДокументИзмененВОкне = ЗаполнитьОбъектВОкне(НовыйОбъект);
                    
                    

                    //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,
                    //которую необходимо передать в уже полученную нами форму
                    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
                КонецЕсли;
            КонецЦикла;
            
            Если Не ДокументИзмененВОкне Тогда
                ЗаполнитьОбъект(Элемент);
            КонецЕсли;

        КонецЦикла;
    КонецЕсли;
КонецПроцедуры  

&НаСервере
Функция ЗаполнитьОбъектВОкне(НовыйОбъект)
    Документ = НовыйОбъект.Ссылка.ПолучитьОбъект();
    Таблица = Документ.ОтражениеВУчете;
    Для Каждого СтрокаДанных Из Таблица Цикл
        Если Счет_НДФЛ(СтрокаДанных.СчетКт) Тогда
            Подразделение = ПолучитьПодразделение(Документ.Дата, Документ.Организация, СтрокаДанных.СубконтоДт1);
            СтрокаДанных.СубконтоКт2 = Подразделение;
            НовыйОбъект.ОтражениеВУчете[СтрокаДанных.НомерСтроки - 1].СубконтоКт2 = Подразделение;
        КонецЕсли;
    КонецЦикла;
    Документ.Записать();
    Возврат Истина;
КонецФункции

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



у меня так сделано и работает, вариант с открытием формы мне не понравился, в свой время.
6 Slepoi7
 
25.12.14
10:11
... нет документации .... хотя бы ссылку на прмеры....
7 Slepoi7
 
25.12.14
10:12
... Спасибо.... буду пробовать!....
8 banco
 
25.12.14
10:15
(6) http://its.1c.ru/db/bspdoc примеры в демо базе БСП
9 hawksib
 
25.12.14
10:16
(7) бывают случаи, когда нужно ОткрытиеФормы, мне оно было не нужно и я от него избавился, ели как. Но сначала нашел пример с открытием формы, и по нему делал http://prosto1s.ru/index.php/19-sozdanie-vneshnej-obrabotki-zapolneniya-tablichnykh-chastej-v-upravlyaemom-prilozhenii-na-primere-konfiguratsii-1s-bukhgalteriya-predpriyatiya