Имя: Пароль:
1C
 
Внешняя печатная форма с использованием ActiveDocument ЗУП 2.5
0 kalisto
 
24.11.16
17:10
Всем, добрый вечер.
У меня есть печатная внешняя форма с шаблоном Word. Выгружаю данные из документа Начисление ЗП по договорникам. Прописала процедуру выгрузки, все вроде бы ок. В документе 21 человек.
Но есть загвоздка. Для первых 9 человек выгружаются данные все. Постепенно с каждым человеком в шаблоне перестают заполняться поля. На 21 физике половину данных не выводит. Сделала сообщалки, чтобы посмотреть, данные-то есть или нет. У всех все заполнено. Что делаю не так, подскажите пожалуйста.
Код функции:
Функция Печать() Экспорт
    
    СписокСотр = Новый СписокЗначений;
    Для каждого стр из СсылкаНаОбъект.ДоговорыНаВыполнениеРабот Цикл
        СписокСотр.Добавить(стр.Физлицо);        
    КонецЦикла;    
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ФизическиеЛица.Ссылка,
                   |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументВид.Представление КАК ДокументВид,
                   |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументДатаВыдачи КАК ДокументДатаВыдачи,
                   |    ВЫРАЗИТЬ(ПаспортныеДанныеФизЛицСрезПоследних.ДокументКемВыдан КАК СТРОКА(300)) КАК ДокументКемВыдан,
                   |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументКодПодразделения,
                   |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер КАК ДокументНомер,
                   |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия КАК ДокументСерия,
                   |    ФИОФизЛицСрезПоследних.Фамилия КАК Фамилия,
                   |    ФИОФизЛицСрезПоследних.Имя КАК Имя,
                   |    ФИОФизЛицСрезПоследних.Отчество КАК Отчество,
                   |    ДоговорГПХ.Ссылка КАК Договор
                   |ИЗ
                   |    Справочник.ФизическиеЛица КАК ФизическиеЛица
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(, ФизЛицо В ИЕРАРХИИ (&ФизЛицо)) КАК ФИОФизЛицСрезПоследних
                   |        ПО (ФИОФизЛицСрезПоследних.ФизЛицо = ФизическиеЛица.Ссылка)
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних(, ФизЛицо В ИЕРАРХИИ (&ФизЛицо)) КАК ПаспортныеДанныеФизЛицСрезПоследних
                   |        ПО ФизическиеЛица.Ссылка = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорГПХ
                   |        ПО (ДоговорГПХ.ФизЛицо = ФизическиеЛица.Ссылка)
                   |ГДЕ
                   |    ФизическиеЛица.Ссылка В ИЕРАРХИИ(&ФизЛицо)
                   |    И ДоговорГПХ.Дата МЕЖДУ &ДатаНач И &ДатаКон";
    
    Запрос.УстановитьПараметр("ФизЛицо", СписокСотр);
    Запрос.УстановитьПараметр("ДатаНач", НачалоГода(СсылкаНаОбъект.Дата));
    Запрос.УстановитьПараметр("ДатаКон", КонецГода(СсылкаНаОбъект.Дата));
    Результат = Запрос.Выполнить();
    ВыборкаДляПроверок = Результат.Выбрать();
    
  АктивныйДокумент = ПолучитьМакет("Макет");
   КомОбъект = АктивныйДокумент.Получить();

        Word = КомОбъект.Application;
        Док=Word.Documents(1);      
        Док.GrammarChecked=0;
        Док.ShowGrammaticalErrors=0;

        Док.Activate();
        Word.Selection.WholeStory();
        Word.Selection.Copy();

        Счетчик = 1;    
Пока ВыборкаДляПроверок.Следующий() Цикл
        Replace = Док.Content.Find;
        FindText = "{ДатаДокумента}";
        ReplaceWith = Строка(Формат(КонецМесяца(СсылкаНаОбъект.Дата), "ДЛФ=Д"))+"г.";
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
        
        Replace = Док.Content.Find;
        FindText = "{НомерД}";
        ReplaceWith = Строка(ВыборкаДляПроверок.Договор.Номер);
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
                
        Replace = Док.Content.Find;
        FindText = "{ДатаД}";
        ReplaceWith = Строка(Формат(ВыборкаДляПроверок.Договор.Дата, "ДЛФ=Д"))+"г.";
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
        Сообщить(ReplaceWith);
        
        Replace = Док.Content.Find;
        FindText = "{Сотрудник}";
        ReplaceWith = Строка(СокрЛП(ВыборкаДляПроверок.Фамилия))+" "+Строка(СокрЛП(ВыборкаДляПроверок.Имя))+" "+Строка(СокрЛП(ВыборкаДляПроверок.Отчество));
        Сообщить(ReplaceWith);        
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
        
        Replace = Док.Content.Find;
        FindText = "{паспорт}";
        ReplaceWith = Строка(ВыборкаДляПроверок.ДокументСерия) +"  "+Строка(ВыборкаДляПроверок.ДокументНомер);
        Сообщить(ReplaceWith);
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
        
        
        Replace = Док.Content.Find;
        FindText = "{паспортвыдан}";
        ReplaceWith = Строка(ВыборкаДляПроверок.ДокументКемВыдан) +"  "+Строка(Формат(ВыборкаДляПроверок.ДокументДатаВыдачи, "ДЛФ=Д"))+"г.";
        Сообщить(ReplaceWith);
        Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
        
        АдресРегистр = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
        АдресРегистр.Отбор.Объект.Установить(ВыборкаДляПроверок.Ссылка);
        АдресРегистр.Прочитать();
        Для каждого Запись из АдресРегистр Цикл
            Если СокрЛП(Запись.Вид.Наименование) = "Адрес по прописке физ. лица" Тогда
                Replace = Док.Content.Find;
                FindText = "{адрес}";
                ReplaceWith = Строка(Запись.Представление);
                Сообщить(ReplaceWith);
                Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
            КонецЕсли;
            
            Если СокрЛП(Запись.Вид.Наименование) = "Адрес по прописке физ. лица" Тогда
                Replace = Док.Content.Find;
                FindText = "{адрес1}";
                ReplaceWith = Строка(Запись.Представление);
                Сообщить(ReplaceWith);
                Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
            КонецЕсли;
            
            Если СокрЛП(Запись.Вид.Наименование) = "Телефон физ. лица" Тогда
                Replace = Док.Content.Find;
                FindText = "{телефон}";
                ReplaceWith = Строка(Запись.Представление);
                Сообщить(ReplaceWith);
                Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,ReplaceWith);
            КонецЕсли;
        КонецЦикла;            
        Word.Selection.EndKey(6);

            Если Счетчик < ВыборкаДляПроверок.Количество() тогда
                Word.Selection.InsertBreak(7);
                Word.Selection.Paste();
            КонецЕсли;
            Счетчик = Счетчик + 1;
            
КонецЦикла;
КомОбъект.Application.Visible=1;
КомОбъект.Activate();
1 piter3
 
24.11.16
17:15
Replace = Док.Content.Find;  не надо по моему повторять для каждого реквизита
лучше бы по уникальнее выбирал бы FindText
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший