Формирование печатных форм в pdf

Публикация № 75969

Разработка - Практика программирования

Делюсь опытом работы с виртуальными принтерами через COM-интерфейс, а также предлагаю альтернативный вариант создания PDF-файлов с помощью внешней компоненты Yoksel.

Возникла задача (и, как показал поиск, не у меня одного) формирования печатных форм в формате pdf для отправки клиентам. Причем процесс этот должен был происходить практически полностью автоматически - в один-два клика. То, что я нашел на эту тему в сети меня не устроило по тем или иным причинам, поэтому пришлось писать свое. Первое с чем я столкнулся - это достаточно скудное количество информации на эту тему, очень мало примеров. Несколько дней разбирался сам, теперь решил поделиться опытом с вами. Америку, я конечно не открыл, но пару интересных решений в процессе написания родилось - возможно кому-то пригодится и сэкономит время.

Публикацию я решил оформить в виде статьи, поскольку написанная мной обработка имеет несколько прикладной характер и заточена под конкретную конфигурацию. Так что поделюсь с вами кодом, и постараюсь прокомментировать его максимально подробно.

Итак, сначала немного предыстории. Изучив вопрос, я остановил свой выбор на бесплатных виртуальных принтерах BullZip PDF Printer и PDFCreator, которые позволяют на выходе получать файлы pdf, а также файлы различных графических форматов. Обе утилиты имеют возможность автосохранения файлов без лишних вопросов пользователю. В принципе, для полуавтоматического создания печатных форм в электронном виде, этого достаточно. Мы можем написать в коде

ТабДок.ИмяПринтера = "PDFCreator"; //"BullZip PDF Printer";
ТабДок.Напечатать();

и в каталогах, указанных в настройках автосохранения, появятся нужные файлы. Но, во-первых, пользователь может что-нибудь в настройках изменить, во-вторых, принтер вообще может оказаться переименован или удален чьими-нибудь шаловливыми ручонками (то есть нам нужно как-то контролировать имя и вообще наличие виртуального принтера в системе), в-третьих, придется настроить автосохранение для каждого пользователя (если принтер не сетевой), в-четвертых, проблематично добиться вменяемого имени файла с помощью настроек. Да и вообще, мы же все хотим делать автоматически, а так пользователю придется самому создать письмо, указать адрес клиента, прикрепить нужные вложения - вероятность ошибки возрастает, ну и лениво конечно. Приходим к выводу, что нужно юзать COM-объект, самому устанавливать необходимые настройки и выполнять нужные действия, чтобы не взрывать потом мозг ни себе, ни пользователю.

Изначально имелось пожелание сохранять файлы в графическом формате, скажем jpeg или png. PDFCreator, по-моему мнению, обладает более гибкими возможностями, но, к сожалению, он не умеет разбивать изображения на страницы, поэтому при сохранении печатных форм в виде картинок, можно наблюдать только первую страницу документа. BullZip же такую функцию имеет, поэтому я начал работать с ним. Но вот его COM-интерфейс оказался довольно скудным, да и плюс ко всему, настройки свои утилита хранит в ini-файле. Соответственно тратится время на их чтение и запись, если мы хотим (а мы хотим!) в них что-то менять. Вобщем, чтобы не извращаться и не придумывать всякую ерунду, было принято решение сохранять печатные формы в pdf и использовать для этих целей PDFCreator. Полностью конечно "ерунды" избежать не удалось, но в целом задача была решена.

Собственно дальше код моей функции для формирования файлов с подробными комментариями в проблемных местах. Функция выдрана из модуля обработки с минимальными изменениями, поэтому имеет "узкие" места в виде привязки к конфигурации и конкретному виду документов. Но общий смысл понятен и при необходимости код легко может быть преобразован для конкретной задачи. 

upd 14.04.2011

Сегодня понадобилось переписать обработку, сделав ее более универсальной. Теперь в главную функцию передается массив готовых табличных документов для конвертации в pdf. Для передачи имен файлов используется свойство табличного документа "ИспользуемоеИмяФайла", которое необходимо заполнить программно до вызова функции конвертации.

upd 03.05.2011

Выявил неявный баг. У табличного документа есть свойство "ИмяПараметровПечати". Оно отвечает за сохранение параметров печати, установленных пользователем, и их восстановление при следующем показе табличного документа. Так вот, если это свойство используется в конфигурации (а в типовых оно, как правило, используется), то при печати в pdf в указанных параметрах будет сохранен наш виртуальный pdf-принтер, и, если в следующий раз табличный документ будет печататься обычным способом, то 1С восстановит именно этот принтер для печати по-умолчанию (не путать с принтером по-умолчанию в Windows). Чтобы этого избежать, после формирования наших файлов, вернем табличному документу его старое имя принтера.

// Функция формирует файлы для отправки по электронной почте с помощью виртуального принтера PDFCreator,
// Возвращаемое значение: тип "Массив" - массив сформированных файлов pdf
// Параметры: ТабличныеДокументы - тип "Массив", массив табличных документов для конвертации
//            Путь - тип "Строка", путь к каталогу, в котором будут создаваться конечные файлы pdf
//
Функция PDFCreator_СформироватьФайлыДляОтправки(ТабличныеДокументы, Путь) Экспорт

   
// Тут все ясно: пробуем создать COM-объект, получилось - хорошо, нет - на нет, как говорится, и суда нет
   
Попытка
       
УтилитаПечати = Новый COMОбъект("PDFCreator.clsPDFCreator");
    Исключение
       
Сообщить("Не установлен драйвер принтера PDFCreator!", СтатусСообщения.Важное);
        Возврат Неопределено;
    КонецПопытки;

   
Состояние("Настройка виртуального принтера ...");

   
// Получим виртуальные принтеры, установленные в системе, если нет ни одного - создадим новый, если есть - будем использовать первый попавшийся
   
ПринтерыPDF = УтилитаПечати.cGetPDFCreatorPrinters();
    Если
ПринтерыPDF.Count() = 0 Тогда
       
УтилитаПечати.cAddPDFCreatorPrinter("PDFCreator");
       
ПринтерыPDF = УтилитаПечати.cGetPDFCreatorPrinters();
    КонецЕсли;
   
ИмяПринтераPDF = ПринтерыPDF.Item(1);

   
// Запустим утилиту, в области уведомлений появится соответствующий значок очереди печати
   
УтилитаПечати.cStart();

   
// PDFCreator позволяет создавать несколько профилей с настройками - это очень удобно: мы не будем менять настройки по умолчанию, а создадим отдельный профиль для печати из 1С и будем его использовать. То есть для "ручной" печати пользователь может настроить принтер как ему вздумается.
    // Проверим, существует ли профиль для печати документов из 1С, если нет - создадим
   
Если Не УтилитаПечати.cProfileExists("Печать 1С") Тогда
       
УтилитаПечати.cAddProfile("Печать 1С", УтилитаПечати.cStandardOptions);
    КонецЕсли;

   
// Поскольку теоретически пользователь может изменить настройки и нашего профиля, а некоторые из них для нас критичны, будем записывать их принудительно каждый раз. Это настройки автосохранения, остальные - пусть меняет, если надо.
    // Запишем настройки профиля, которые не должны меняться
   
НастройкиПоУмолчанию = УтилитаПечати.cReadOptions("Печать 1С");
   
НастройкиПоУмолчанию.UseAutosave = 1;
   
НастройкиПоУмолчанию.UseAutosaveDirectory = 1;
   
НастройкиПоУмолчанию.UseCreationDateNow = 1;
   
НастройкиПоУмолчанию.AutosaveDirectory = Путь;

   
// Подробно на каждой опции останавливаться не буду, думаю и так понятно. Поясню только принципиальный момент, на котором строится дальнейшая логика работы функции.
    // Я долго пытался добиться более менее вменяемого и при этом уникального имени файла стандартными настройками - это оказалось довольно проблематично. В итоге я пришел к такой схеме: в качестве имени файла автосохранения используем предопределенную настройку Title - заголовок нашего документа. Поскольку табличный документ мы создаем программно, средствами 1С изменить его не удастся (есть лишь возможность задать его при выводе на экран, указав в качестве первого параметра метода Показать()). Соответственно, используя такую настройку, мы всегда будем получать файл вида "Табличный документ.pdf". Что ж, значит, придется переименовать его после. Если бы мы печатали один файл, можно было задать его имя сразу в настройках, но мы-то хотим печатать много и сразу, а в этом случае опции просто не будут успевать сохраняться. Короче говоря, экспериментальным путем я пришел именно к такому варианту.
   
НастройкиПоУмолчанию.AutosaveFileName = "Title"; // Здесь Title должно быть в угловых скобках, но редактор HTML воспринимает это как тег и сбивает разметку

   
НастройкиПоУмолчанию.AutosaveFormat = 0; // 0 = PDF, 1 = PNG, 2 = JPEG, 3 = BMP, 4 = PCX, 5 = TIFF, 6 = PS, 7 = EPS, 8 = TXT, 9 = PDF/A-1b, 10 = PDF/X, 11 = PSD, 12 = PCL, 13 = RAW
   
НастройкиПоУмолчанию.AutosaveStartStandardProgram = 0;
   
УтилитаПечати.cSaveOptions(НастройкиПоУмолчанию, "Печать 1С");

   
Состояние("Создание файлов ...");

   
// Делаем наши настройки текущими. Возможно как-то можно сделать активным конкретный профиль программно, но мне это не удалось, а так - заработало и ладно. По сути здесь мы подменяем настройки по умолчанию своими.
   
УтилитаПечати.cOptionsProfile = "Печать 1С"; // эта строка, по-моему, не работает, но так "красивше" =)
   
УтилитаПечати.cOptions = НастройкиПоУмолчанию;

   
// Собственно, начинаем штамповать наши файлы
   
МассивФайлов = Новый Массив;
    
Для Индекс = 0 По ТабличныеДокументы.Количество() - 1 Цикл
        // Получаем табличный документ по индексу из массива. Цикл Для ... По ... используем для того, чтобы иметь возможность сразу получать индекс элемента из счетчика без применения метода Найти(). 
       
ТабДок = ТабличныеДокументы[Индекс];

        // Запоминаем старое имя принтера, т.к. при использовании параметров печати, они будут сохраняться с нашим pdf-принтером
       
СтароеИмяПринтера = ТабДок.ИмяПринтера;        

        // Далее уже знакомый нам кусок кода. Все настройки сделаны - можем смело печатать.
        
ТабДок.ИмяПринтера = ИмяПринтераPDF;
        
ТабДок.Напечатать();

        
// Здесь одна особенность, которую я победил не очень хорошим способом. Помните, что у нас все файлы называются "Табличный документ.pdf"? Это нас не устраивает - надо переименовать, но поскольку принтер работает не мгновенно, необходимо сначала дождаться, пока файл сформируется и запишется на диск. Так что запускаем цикл и ждем пока файл появится. Да, грузится проц, но что поделать - это ненадолго.
        
// На случай, если что-то пойдет не так, ставим ограничение в 30 секунд, по истечении которых цикл прерываем принудительно
        
ФайлСформирован = Истина;
        
ФайлPDF = Новый Файл(Путь + "Табличный документ.pdf");
        
Порог   = ТекущаяДата() + 30;
        Пока Не
ФайлPDF.Существует() И ФайлСформирован Цикл
            
ОбработкаПрерыванияПользователя();

            Если
ТекущаяДата() >= Порог Тогда
                
ФайлСформирован = Ложь;
            КонецЕсли;
        КонецЦикла;
        
// Наш файл уже существует, но еще не записан - ждем еще, но не более 30 секунд
        
Порог = ТекущаяДата() + 30;
        Пока
ФайлPDF.Размер() = 0 И ФайлСформирован Цикл
            
ОбработкаПрерыванияПользователя();

            Если
ТекущаяДата() >= Порог Тогда
                
ФайлСформирован = Ложь;
            КонецЕсли;
        КонецЦикла;

        
// Произошла исключительная ситуация - файл не был создан в течение длительного времени
        
Если Не ФайлСформирован Тогда
            
Сообщить("Ожидание отклика завершено. Файл не создан!", СтатусСообщения.Важное);

            Попытка
                
УтилитаПечати.cClose();
            Исключение
                
Сообщить("Нормальное завершение процесса печати невозможно!", СтатусСообщения.ОченьВажное);
            КонецПопытки;
            
УтилитаПечати        = Неопределено;
            
НастройкиПоУмолчанию = Неопределено;

            
Состояние();

            Возврат Неопределено;
        КонецЕсли;

        
// Вот теперь переименуем его. Используем свойство табличного документа "ИспользуемоеИмяФайла" (должно быть заполнено программно до вызова процедуры, предполагается, что имя файла указано без расширения), либо, если оно не заполнено, просто порядковый номер элемента.
        
НовоеПолноеИмя = Путь + ?(ЗначениеЗаполнено(ТабДок.ИспользуемоеИмяФайла), ТабДок.ИспользуемоеИмяФайла, "Табличный документ " + Строка(Индекс + 1)) + ".pdf";
       
ПереместитьФайл(ФайлPDF.ПолноеИмя, НовоеПолноеИмя) ;
         

        
// Добавим в массив вложений, который вернет в итоге наша функция
        
ФайлPDF = Новый Файл(НовоеПолноеИмя);
        
МассивФайлов.Добавить(ФайлPDF);

        // Возвращаем старое имя принтера, чтобы не менялись параметры печати по-умолчанию
        
ТабДок.ИмяПринтера СтароеИмяПринтера;
    КонецЦикла;

   
// Закрываем утилиту - иконка в трее пропала. Что примечательно, закрывать раньше времени очередь печати нельзя, а то пропадут все задания, но так как мы с нетерпением ждем появления каждого файла и в этот момент уже дождались, то тут все ок.
   
УтилитаПечати.cClose();
   
УтилитаПечати        = Неопределено;
   
НастройкиПоУмолчанию = Неопределено;

   
Состояние();

    Возврат
МассивФайлов;

Конецфункции

Ну а дальше уже дело техники, что с этими файлами делать... Я, например, использую встроенный в УТ почтовый клиент, создаю новое письмо, заполняю адрес из контактной информации контрагента, добавляю туда вложения и открываю письмо пользователю для просмотра и принятия решения об отправке, а pdf-ки с диска удаляю.

Естественно, мой код не претендует на истину в последней инстанции - может где и коряво получилось, но вобщем-то он работает и свою задачу выполняет. Более элегантного решения я во всяком случае не нашел. Принимаю конструктивную критику и предложения

upd 08.10.2010

Создал аналогичную функцию с использованием внешней компоненты Yoksel. Код проще и прозрачнее, файлы формируются намного быстрее, нет заморочек с искусственными задержками времени, но печатная форма добавляется в документ картинкой, причем не очень хорошего качества, плюс требуется создание временного файла на диске для последующей конвертации.

// Функция формирует файлы для отправки по электронной почте с помощью внешней компоненты Yoksel.dll
//
Функция Йоксель_СформироватьФайлыДляОтправки(ТабличныеДокументы, Путь)

    Попытка
       
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "Yoksel.dll");

       
Йоксель      = ПолучитьCOMОбъект("","Йоксель");
       
КонвертерPDF = Йоксель.СоздатьГрафическийКонвертерPDF();
    Исключение
       
Предупреждение("Не удалось загрузить внешнюю компоненту Yoksel! Сообщите администратору системы!", 20);
        Возврат Неопределено;
    КонецПопытки;

   
МассивФайлов = Новый Массив;

   
Состояние("Создание файлов ...");

    
Для Индекс = 0 По ТабличныеДокументы.Количество() - 1 Цикл 
        
// Получаем табличный документ
        
ТабДок = ТабличныеДокументы[Индекс];

        
// Формируем временный файл xls
        
ИмяФайлаБезРасширения = ?(ЗначениеЗаполнено(ТабДок.ИспользуемоеИмяФайла), ТабДок.ИспользуемоеИмяФайла, "Табличный документ " + Строка(Индекс + 1));
        
ТабДок.Записать(Путь + ИмяФайлаБезРасширения + ".xls", ТипФайлаТабличногоДокумента.XLS97);

        
// Конвертируем временный файл в формат pdf
        
Попытка
            
Таб = Йоксель.СоздатьТабличныйДокумент();
            
Таб.Открыть(Путь + ИмяФайлаБезРасширения + ".xls", "2");
            
КонвертерPDF.Документ = Таб;
            
КонвертерPDF.КоличествоБитНаПиксел = 24; //1, 4, 8, 24
            
КонвертерPDF.ПолеСлева = 1134; // в твипах (1 твип = 1/567 см)
            
КонвертерPDF.ЗаписатьВФайл(Путь + ИмяФайлаБезРасширения + ".pdf");
        Исключение
            
УдалитьФайлы(Путь + ИмяФайлаБезРасширения + ".xls");
            
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
            Возврат Неопределено;
        КонецПопытки;

        
// Удаляем временный файл xls
        
УдалитьФайлы(Путь + ИмяФайлаБезРасширения + ".xls");

        
// Добавляем в массив вложений
        
ФайлPDF = Новый Файл(Путь + ИмяФайлаБезРасширения + ".pdf");
        
МассивФайлов.Добавить(ФайлPDF);
    КонецЦикла;

   
Йоксель = Неопределено;

   
Состояние();

    Возврат
МассивФайлов;

КонецФункции

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. detec 130 24.09.10 17:15 Сейчас в теме
Отдельная благодарность за код: хорошо оформленный визуально и снабжённый подробными комментариями.
3. Spartan 348 24.09.10 17:29 Сейчас в теме
(1) Спасибо, буду рад, если кому-то мой опыт поможет...
(2) Вообще писал для клиента, как видите, в коде присутствуют методы, не используемые на сервере - самый главный из которых Напечатать(). Возможно на сервере можно будет решить другими методами класса, но не уверен.
78. boss_kuz 90 05.08.12 13:12 Сейчас в теме
Предлагаю поменять часть кода определения создания файла типа :

	ФайлPDF = Новый Файл(Путь + "Title.pdf");	
	НовоеПолноеИмя = Путь + ?(ЗначениеЗаполнено(ТабличныйДокумент.ИспользуемоеИмяФайла), ТабличныйДокумент.ИспользуемоеИмяФайла, "Табличный документ " + Строка(1)) + ".pdf";	
	ФайлСформирован = Ложь;
	Порог = ТекущаяДата() + 30;
	Пока ТекущаяДата()<Порог цикл
		ОбработкаПрерыванияПользователя();
		Попытка
			ПереместитьФайл(ФайлPDF.ПолноеИмя, НовоеПолноеИмя);
			ФайлСформирован = Истина;
			Break;
		Исключение
			Продолжить;
		КонецПопытки;
	КонецЦикла;
	
	Если Не ФайлСформирован Тогда
		Сообщить("Ожидание отклика завершено. Файл не создан!",СтатусСообщения.Важное);		
		Попытка
			УтилитаПечати.cClose();
		Исключение
			Сообщить("Нормальное завершение процесса печати невозможно!", СтатусСообщения.ОченьВажное);
		КонецПопытки;
		УтилитаПечати        = Неопределено;
		НастройкиПоУмолчанию = Неопределено;		
		Состояние();		
		Возврат ложь;
	КонецЕсли;
Показать
91. N.Serg 03.12.13 18:55 Сейчас в теме
может кому-то пригодится, т.к. у меня ушла куча времени
Попытка
		ПринтерПДФ = Новый COMОбъект("PDFCreator.clsPDFCreator");
	Исключение
		Сообщить("Не установлен драйвер принтера PDFCreator!", СтатусСообщения.Важное);
		Возврат Неопределено;
	КонецПопытки;
	
	ПринтерыPDF = ПринтерПДФ.cGetPDFCreatorPrinters();
	Если ПринтерыPDF.Count() = 0 Тогда
		ПринтерПДФ.cAddPDFCreatorPrinter("PDFCreator");
		ПринтерыPDF = ПринтерПДФ.cGetPDFCreatorPrinters();
	КонецЕсли;
	ИмяПринтераPDF = ПринтерыPDF.Item(1);
			
	ПринтерПДФ.cStart("/NoProcessingAtStartup"); 
	ПринтерПДФ.cClearcache();
	ПринтерПДФ.cPrinterStop = 1;
	
	НаборОпций = ПринтерПДФ.cOptions();
	НаборОпций.NoConfirmMessageSwitchingDefaultprinter   = 1;
	НаборОпций.UseAutosave                        = 1;
	НаборОпций.UseAutosaveDirectory                  = 1;
	НаборОпций.AutosaveFormat                     = 0; // PDF  
	НаборОпций.AutosaveDirectory                  =  Путь;
	НаборОпций.AutosaveFilename                   = "111.PDF";
	НаборОпций.AutosaveStartStandardProgram       = 0;

	ПринтерПДФ.cOptions = НаборОпций;

	Для Индекс = 0 По ТабличныеДокументы.Количество() - 1 Цикл				
		ТабДок = ТабличныеДокументы[Индекс];
		ТабДок.ИмяПринтера = ИмяПринтераPDF;
		ТабДок.Напечатать();	
    КонецЦикла;;

	ПринтерПДФ.cCombineAll();
	ПринтерПДФ.cPrinterStop = 0;

	Счетчик = 0;
	Пока ПринтерПДФ.cCountOfPrintjobs > 1 Цикл
	   Счетчик = Счетчик + 1;
	   ПринтерПДФ.cCombineAll();
	   Старт = ТекущаяДата();
	   Пока ТекущаяДата() <> Старт + 1 Цикл 
	   КонецЦикла;          
	КонецЦикла;
	         
	Старт = ТекущаяДата();
	Таймаут = 5;

	Пока НЕ ЗначениеЗаполнено(ПринтерПДФ.cOutputFileName) ИЛИ (ТекущаяДата() - Старт < Таймаут) Цикл
	КонецЦикла;
	         
	ПринтерПДФ.cClearcache();
	ПринтерПДФ.cClose();
	ПринтерПДФ = Неопределено;
	
	Возврат Истина;
Показать
sam1975; Spartan; +2 Ответить
2. detec 130 24.09.10 17:18 Сейчас в теме
И ещё вопросик. На сервере приложения обработка работает?
4. Свой 164 24.09.10 19:19 Сейчас в теме
для 1С 7.7 сделайте кто-нибудь аналогичный примерчик
5. ILM 238 24.09.10 19:52 Сейчас в теме
Очень Хорошо! А для PDFForm заполнения примерчика нету?
6. Spartan 348 24.09.10 20:45 Сейчас в теме
(5) К сожалению, нет. :) Остановил свой выбор на PDFCreator, задачу решил - теперь можно отдыхать...
7. rahimov1965 24.09.10 23:21 Сейчас в теме
Решал аналогичную задачу, с помощью BullZip не справился с проблемой прозрачности печатей и факсимиле. Решается ли эта задача при помощи PDF-creator? Мне пришлось использовать платную программу Universal Document Convertor, но там есть смешная затыка: ТабличныйДокумент.Напечатать(Ложь) - только с открытием диалога.
8. Spartan 348 24.09.10 23:43 Сейчас в теме
(7) Честно говоря, не знаю... Мне нужно было формировать просто формы без печатей, поэтому с прозрачностью не разбирался.
9. itoz 69 25.09.10 08:11 Сейчас в теме
Автору респект за указание направления хода мысли и плюсик. Кому действительно надо, под себя переделает если-что.
10. cool.clo 25.09.10 08:27 Сейчас в теме
Плюс безусловно, но к сожалению pdf creator не понимает прозрачности, пытался как-то через метод pdfforge.StampPDFFileWithImage печать добавить, но все это не то. Наверно придется думать насчет Universal Document Convertor
11. Noy 1066 25.09.10 12:34 Сейчас в теме
(0) Молодец - очень хорошо разжевано! Не просто кусок кода, а прямо таки лекция.

Как один из аналогов для решения подобной задачи:
начиная с 2007 версии МС офиса - есть бесплатное дополнение "Save as PDF & XPS" - в теории им можно порулить через Ole.
Естественно нужен сам офис, и нужно будет печатные формы пересохранять в xls или doc...
13. Noy 1066 25.09.10 13:43 Сейчас в теме
14. Spartan 348 25.09.10 14:04 Сейчас в теме
(11),(12) Согласен, так оно конечно проще будет, но нужен офис 2007-й, а он не бесплатный... У наших юзеров он есть далеко не у всех.
20. Трактор 1200 27.09.10 09:46 Сейчас в теме
(14) Если ненравится платный МСофис, то можно пользовать бесплатный Опен офис. http://infostart.ru/public/20710/ Опенофисные ПДФки качественнее ПДФкреаторских.
Но по большому счёту выбор инструмента определяется личными предпочтениями разработчика. Автору плюс за качественное описание.
megatrend; Spartan; +2 Ответить
21. Spartan 348 27.09.10 10:10 Сейчас в теме
(20) У нас почти у всех юзеров стоит мс офис, только у большинства он 2003-й, у некоторых - опен, но они категорически не желают с ним работать.. :D Держать его на компах в качестве конвертера как-то не айс, проще поставить небольшую утилиту.

А вообще согласен полностью: вариантов решения задачи - масса, и в каждом конкретном случае, разработчик сам выбирает приемлемый. Но в любом случае, думаю, неплохо иметь пару альтернативных про запас... ;)
15. megatrend 121 26.09.10 19:41 Сейчас в теме
Интересно, поучительно и перспективно! :idea:

А если кому-то чего-то не хватает в PDFCreator - добро пожаловать в его команду разработки!
Programming Languages: Visual Basic
License: GNU General Public License (GPL)
Трактор; +1 Ответить
16. CheBurator 3425 26.09.10 20:48 Сейчас в теме
Идем, берем Йоксель и сохраняем в ПДФ (по миниумму возможностей) безо всяких виртуальных принтеров и прочей шняги
17. Spartan 348 26.09.10 23:17 Сейчас в теме
(16) С удовольствием бы, только вот под 8-ку нету его пока... ;)
18. CheBurator 3425 26.09.10 23:19 Сейчас в теме
Йоксель работает и под 8-ой
19. Spartan 348 27.09.10 08:31 Сейчас в теме
(18) Может конечно и так - я не пробовал... Только тогда автору стоило бы сделать свою страничку более информативной - я никакого упоминания о 8-ке там не нашел, и наоборот на глаза попадаются старые посты и комменты, в которых говорится, что компонента с 8-кой не работает или работает с извратом.
22. cool.dkf 27.09.10 13:09 Сейчас в теме
+Спс
Кстати может кому пригодится - черновой вариант функции для печати через Universal Document Converter, прога платная правда(потому наверное буду юзать pdfcreator)
Функция PDFСформироватьФайлыДляОтправки(Ссылка, Печатнаяформа, ИмяФайла) Экспорт

Попытка
УтилитаПечати = Новый COMОбъект("UDC.APIWrapper");
Исключение
Сообщить("Не установлен драйвер принтера", СтатусСообщения.Важное);


//Сюда можно вставить код установки проги - которая в макете
//УникальныйИдентификатор = Новый УникальныйИдентификатор();
//ИмяВременногоФайла = КаталогВременныхФайлов() + УникальныйИдентификатор + ".exe";

//Макет = ПолучитьОбщийМакет("Макет");
//Макет.Записать(ИмяВременногоФайла);
//Сообщить(ИмяВременногоФайла);
//WshShell = Новый COMОбъект("WScript.Shell");
////WSHShell.Run(ИмяВременногоФайла,5);
//Выполнение=WshShell.exec(ИмяВременногоФайла);
//Пока Выполнение.Status=0 Цикл
// Сообщить("Идет настройка");
//КонецЦикла;
//Предупреждение("Кончили!");
//УдалитьФайлы(ИмяВременногоФайла);




Возврат Неопределено;
КонецПопытки;

Состояние("Настройка виртуального принтера ...");
УтилитаПечати.Activate();
УтилитаПечати.ActivationMode = 1;

// Получим виртуальные принтеры, установленные в системе, если нет ни одного - создадим новый, если есть - будем использовать первый попавшийся
itfPrinter = УтилитаПечати.Printers("Universal Document Converter");
itfProfile = itfPrinter.Profile;
УникальныйИдентификатор = Новый УникальныйИдентификатор();
ИмяВременногоФайла = КаталогВременныхФайлов() + УникальныйИдентификатор + ".xml";
Макет = ПолучитьОбщийМакет("ПрофильВиртуальногоПринтера");
Макет.Записать(ИмяВременногоФайла);
itfProfile.Load (ИмяВременногоФайла);
// Для Стр = 0 По (Печатнаяформа.КоличествоСтраниц - 1) Цикл
itfProfile.OutputLocation.FileName =ИмяФайла;
ИмяПринтераPDF =itfPrinter.Name;
ТабДок = Печатнаяформа;
ТабДок.ИмяПринтера = ИмяПринтераPDF;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Напечатать();

УдалитьФайлы(ИмяВременногоФайла);
Возврат ТабДок;

Конецфункции


Вообще очень удобная штука, с названием документов проблем нет, как вариант (еще недоделал можно к названию добавлять номера страниц, к тому же профили печати хранить в макетах и менять если надо)
Можно сделать и процедуру
Код недоделан потому строго не судите, за основу брал эту статью, последние строчки для отладки,
В функцию передаются Ссылка - Ссылка на печатаемый документ, ПечатнаяФорма - ТабличныйДокумент, ИмяФайла - у меня это имя файла складывающееся из названия документа + расширение
Rustig; Spartan; +2 Ответить
23. son_v 2 27.09.10 15:28 Сейчас в теме
Спасибо за информацию. Как раз стоит такая задача ).
24. cool.dkf 27.09.10 15:52 Сейчас в теме
Забыл сказать, что профили для Universal Document Converter можно сделать в настройках самого виртуального принтера, сохранив затем в xml файл
25. ValeriTim 20 27.09.10 17:04 Сейчас в теме
Ай, молодца ! Отлично ! :D
Хотя сейчас такой задачи не стоит, но закладочка.
26. FERRO 27.09.10 22:32 Сейчас в теме
Да, всё хорошо, но только для клиентского варианта v8.х пользования - когда это надо одному или нескольким юзерам, т.е каждому на клиенте инсталим bullzip (или PDFCreator) и в путь..........а вот теперь представьте, если народу 30, 50, 100 или более человек и всё крутится например под 64 bit-ным Microsoft SQL Server 2003 SP2 R2 и задача стоит, не устанавливая виртуальный принтер на каждом компе (правда при условии, что хоть какой-то acrobat reader имеется в наличии у всех), преобразовывать табличный (или любой другой) документ в *.pdf на сервере, а клиенту выплевывать готовый файл (ну или хотя бы двоичные данные), да ещё и без использования какой-либо общедоступной шары........???...........Ваш вариант, надеюсь понимаете, не прокатит. Мало того что "Напечатать()" - не доступен на сервере, так исчо и для 64 bit-ной 1С 32 bit-ный COM (а именно его использует bullzip даже с установленной 64 bit-ной примочкой, которая к нему прилагается) не виден............. Так какой же вариант рулит......... ;) (вобщем если кому интересно - могу поведать).
27. iov 406 27.09.10 23:04 Сейчас в теме
(26) поведай конечно. Интересно ж кто как с этим тра* работает то... Еще один вариант добавляет плюсы в карму.
28. Spartan 348 28.09.10 01:20 Сейчас в теме
(26) Конечно, понимаю и представляю... Делал сугубо под нужды своего предприятия - для меня этот вариант вполне приемлем. Ваш тоже интересно будет посмотреть... Чем больше вариантов будет, тем лучше.
29. cool.dkf 28.09.10 11:15 Сейчас в теме
Для большого числа клиентов нужен механизм, встроенный в саму 1С. Да наверное прокатит какая-нить внешняя компонента, наподобие yoksel.dll. Но версия выложенная на сайте прозрачность не поддерживает. Либо самому написать ВК - просто не у всех есть время и умение, да и задачи у всех разные. Но очень интересно услышать оригинальный способ решения этой проблемы.
PS (26)опечатка - SQL Server 2005
34. Ужас бухгалтера 221 29.09.10 18:16 Сейчас в теме
(29) > Но версия выложенная на сайте прозрачность не поддерживает.

Кто это тебе такое сказал?
Вот тема, где выложен XLS-файл с прозрачной картинкой и PDF, который был из него получен (естественно с прозрачностью): http://yoksel.net.ru/forum/topic.php?id=174

И вообще, как можно, видеть в теме, Ёпрст (заказчик этого дела) специально интересовался прозрачностью.

О работе из восьмерки и картинках с прозрачностью есть еще обсуждение здесь: http://yoksel.net.ru/forum/topic.php?id=211
35. cool.dkf 29.09.10 20:48 Сейчас в теме
(34)Виноват - действительно проблема оказалась не в yoksel-е, а в 1С, о чем собственно и свидетельствует http://yoksel.net.ru/forum/topic.php?id=211
31. Spartan 348 28.09.10 16:11 Сейчас в теме
(30) Я, собственно, и не испытывал иллюзий по поводу того, что мне первому пришло в голову юзать COM-объект виртуального принтера. Кстати, мой код, извините, мне нравится больше - в указанном примере как раз присутствуют все те ситуации, которые я постарался учесть и обойти:
- функция не будет работать, если виртуальный принтер будет удален или переименован;
- все время меняется принтер в системе по-умолчанию;
- имя файла указывается явно в настройках автосохранения (попробуйте использовать этот код при пакетной печати и посмотрите, что будет происходить с файлами);
- непонятен смысл использования конструкции # Если Клиент, так как метод Напечатать() не работает на сервере;

З.Ы. Да, и этой темы, я кстати, не видел: со всеми свойствами и методами классов разбирался самостоятельно. Думаю, что имею право поделиться собственными наработками...
32. Spartan 348 28.09.10 16:32 Сейчас в теме
+ (31) Вот, что понравилось - это принудительный выход из цикла, на случай, если файл не сформировался, пожалуй, надо добавить в код...
33. Yashazz 3327 28.09.10 23:12 Сейчас в теме
Баян, но может быть полезно... Я от PDFCreator'a отказался в пользу обычного пинания экселевского SaveAs, и нам хватило. Тоже накатал было для PDFCreator обработку, да бросил за ненадобностью. Ваш вариант хорош для тех, у кого MS Офис и не стоит вообще, и других конвертеров нету.
36. CheBurator 3425 30.09.10 04:24 Сейчас в теме
ну как обычно - Йоксель наиболее правильное решение...
37. Spartan 348 08.10.10 14:49 Сейчас в теме
(36) Вобщем, что хочу сказать... Сделал я аналогичную функцию с помощью Йокселя... Есть свои плюсы и свои минусы.

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

Минусы: печатная форма добавляется в документ одной картинкой, причем ее качество оставляет желать лучшего, нужен временный файл, сохраненный на диске, для последующей конвертации, мало настроек конвертера PDF.

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

З.Ы. Да... с прозрачностью я не разбирался - мне не надо. Вобщем, только укрепился в своем мнении: каждый способ имеет право на существование, у каждого свои недостатки и свои преимущества.
38. Redokov 80 11.10.10 18:26 Сейчас в теме
Плюсую. Хороший пример, читаемый код.
39. iiceberg 89 24.10.10 14:57 Сейчас в теме
Добавил свойство для pdfcreator
НастройкиПоУмолчанию. saveFileName = имяфайла;
В профиле имя отразилось, настройки сохранились. Но при печати не подхватывает профиль "печать 1с"
Как заставить принтер использовать выбранный профиль?
40. Spartan 348 24.10.10 19:28 Сейчас в теме
(39) Заставить принтер использовать профиль мне не удалось, у меня просто подменяются настройки по умолчанию:
УтилитаПечати.cOptions = НастройкиПоУмолчанию;
Свойство saveFileName будет работать только для ручного сохранения: нужно отключить автосохранение и программа будет выводить соответствующий диалог, в котором и будет это имя использоваться.
41. lees 17.12.10 13:45 Сейчас в теме
твой рассказ мне очень помог разобраться с ковертацией в pdf! Естественно большой +.

но вот непорядок, скачал yoksel_comserver_hotfix_2010_06_29.rar c http://yoksel.net.ru/Hotfixes, зарегил
и во время выполнения кода
Попытка
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "Yoksel.dll");
Исключение
Предупреждение("Не удалось загрузить внешнюю компоненту Yoksel! Сообщите администратору системы!", 20);
Возврат Неопределено;
КонецПопытки;

у меня выскакивает ошибка Runtime error:
http://s1.ipicture.ru/Gallery/Viewfull/2636824.html (ошибка в демо-базе yoksel_demo_config_1cv81.rar)

Может кто подскажет в чем подвох, поиск поюзал - проблем вподе подобных не возникает. Yoksel.dll лежит в каталоге bin.
42. cool.clo 17.12.10 13:54 Сейчас в теме
(41) тебе надо к разработчику yoksel (если не ошибаюсь ужасбухгалтера),
ЗЫ Как вариант, ты скачал последнюю версию yoksel, совместима ли она с демо-конфой, попробуй на других использовать (напиши свой код, методы и свойства в справке есть) Тем более ты пишешь, что ошибка возникает во время выполнения кода, ну так найди это проблемное место в коде 1С и подумай.
43. lees 17.12.10 14:08 Сейчас в теме
(42) вот проблемное место
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "Yoksel.dll");

Фишка в том, что если код заменить на следующий

Попытка
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "Yoksel111111111.dll");
Исключение
Предупреждение("Не удалось загрузить внешнюю компоненту Yoksel! Сообщите администратору системы!", 20);
Возврат Неопределено;
КонецПопытки;

тогда ошибки Runtime Error не будет, будет лишь Предупреждение (т.е. нормальная обработка исключительной ситуации)
45. cool.vlad4 45 17.12.10 14:37 Сейчас в теме
(43) ну так блин естессно :D
даже я тебе больше скажу если ты напишешь вместо yoksel.dll зюзя.dll тоже самое будет
А у тебя другие ВК нормально работают?
44. Spartan 348 17.12.10 14:18 Сейчас в теме
(41) Попробуй вот эту бросить в каталог программы...
Хотя это похоже та же самая...
46. Spartan 348 17.12.10 14:49 Сейчас в теме
(41) Ну вообще в демо-базе йокселя компонента уже грузится при старте системы... Если никаких предупреждений при запуске не выдается, значит, библиотека загружена. Попробуй просто убрать код повторной загрузки.
47. cool.vlad4 45 17.12.10 15:00 Сейчас в теме
(46) А почему ты решил, что у него повторная загрузка? по моему одна...но он так описал, все, что угодно может быть (хоть в журнальчик бы взглянул) ...даже вот так бывает http://support.microsoft.com/kb/884538
48. Spartan 348 17.12.10 15:06 Сейчас в теме
(47) Потому что у него приведен кусок кода из моей публикации... Но это было в контексте моей задачи и естественно другой базы (да и вообще это я так... баловался...), а в демо-базе йокселя компонента грузится ПриНачалеРаботыСистемы().
51. lees 17.12.10 15:42 Сейчас в теме
(48) >Потому что у него приведен кусок кода из моей публикации.....
Да, я сначала юзал кусок кода из публикации и подумал что возможно что-то делаю не так,
но на практике оказалось, что и в демке также вылетает
52. Spartan 348 17.12.10 15:57 Сейчас в теме
(51) Ну тогда тебе действительно лучше с разработчиком Йокселя на эту тему пообщаться... Какие-нить другие ВК пробовал загружать? Только йоксель падает?
53. lees 17.12.10 16:54 Сейчас в теме
(52) Только йоксель падает. Работает например ScanOpos.dll для считывания штрихкодов
49. cool.vlad4 45 17.12.10 15:09 Сейчас в теме
:D тогда ты прав, просто только из его комментов это сложно понять...
50. Spartan 348 17.12.10 15:12 Сейчас в теме
(49) Хотя по идее и повторная загрузка не должна давать ошибки... Но тут действительно хз, что за ситуация в целом... :)
54. lees 17.12.10 17:08 Сейчас в теме
вот что я делаю:
1) копирую yoksel.dll в папку C:/Progmram Files/1Cv81/bin
2) regsvr32 yoksel.dll и вижу предупреждение об удачной регистрации
3) Запускаю демо-базу yoksel

Далее, 8-ка вылетает :?:

Версия платформы 1С 8.1.15.14
55. cool.vlad4 45 17.12.10 17:37 Сейчас в теме
Это только на твоем компе? посмотри журнал событий...
56. lees 20.12.10 11:47 Сейчас в теме
(55)это не только на моем, но и на 2 других смотрел

Заработало! Оказалось, что за место метода
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "Yoksel.dll");
мне нужно использовать
ПодключитьВнешнююКомпоненту("Йоксель")
;)

Вот мой топик на мисте
http://www.forum.mista.ru/topic.php?id=523437
:)
57. lees 20.12.10 11:54 Сейчас в теме
чтобы картинка вмещалась в pdf вероятно необходимо варьировать параметрами ШиринаСтраницы и КоличествоБитНаПексел. Так? (ПолеСверху, ПолеСлева,... - само собой)
58. Pavel777777 62 22.12.10 10:46 Сейчас в теме
Хорошая статья, в свое время тоже остановился на PDFCreator для сохранения печатных форм ) Пара дополнений (может пригодятся) :
- Печатную форму из нескольких страниц можно сохранять в виде изображения в формате TIFF. Соответственно, "НастройкиПоУмолчанию.AutosaveFormat = 5;" В этом случае при просмотре стандартной программой просмотра изображений xp появляется внизу кнопочка перехода между страницами.
- Не совсем понятна проблема с получением нужного имени файла. Может это только в 8-ке так? В 7-ке используя "НастройкиПоУмолчанию.AutosaveFileName = "Title"; // Здесь Title должно быть в угловых скобках, но редактор HTML воспринимает это как тег и сбивает разметку" и затем в процедуре печати 1с "ИсхТабл.Показать("Счет_"+СокрЛП(Докум.НомерДок),,-1);" получалось нужное имя файла вида "Счет_[НомерДок].tif"
59. Spartan 348 20.01.11 12:35 Сейчас в теме
(58) Не заметил комментарий, но лучше поздно, чем никогда... С именем файла есть нюансы. Во-первых, чтобы получить имя таким образом, табличный документ нужно, как минимум, показать. Можно конечно потом скрыть, но мельтешение окон не есть гуд - мне нужно было выполнять все "тихо": сформировать файл, добавить во вложения, открыть письмо. А, во-вторых, даже в таком случае пришлось бы прибегнуть к искусственной задержке времени, т.к. опции не успевали бы сохраняться. Короче, как я и написал в статье, пришел к такому варианту опытным путем.
60. idw 343 06.02.11 07:56 Сейчас в теме
К статье про Yoksel я бы еще добавил вот такой код, иначе получаются листы пдф, которые не умещаются на одном листе:


Если ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт Тогда
//ШиринаСтраницыВТвипах = ТабДок.ВысотаСтраницы * 567/10;
//ВысотаСтраницыВТвипах = ТабДок.ШиринаСтраницы * 567/10;
ШиринаСтраницыВТвипах = 16839;
ВысотаСтраницыВТвипах = 11907;
Иначе
//ШиринаСтраницыВТвипах = ТабДок.ШиринаСтраницы * 567/10;
//ВысотаСтраницыВТвипах = ТабДок.ВысотаСтраницы * 567/10;
ШиринаСтраницыВТвипах = 11907;
ВысотаСтраницыВТвипах = 16839;
КонецЕсли;

Это для формата А4
61. sash-ml 20.04.11 13:14 Сейчас в теме
Спасибо за обновление публикации.
Я давно использую этот алгоритм и PDF creator для массовых рассылок инфы клиентам
Для дополнительного удобства пользователей изменил немного общую форму "ПечатьДокументов"
Добавил на нее кнопочку PDF которая генерирует PDF файлик согласно алгоритму изложенному в статье а после этого помещает этот PDF файлик в буфер обмена виндовс. Статью про буфер обмена где то тут нашел давным-давно но не помню где именно.
Главное юзеры довольны очень.
62. Alex Y 165 21.04.11 10:41 Сейчас в теме
Спасибо за идею
Поменяйте ссылку PDFCreator на
http://sourceforge.net/projects/pdfcreator/
63. Spartan 348 21.04.11 11:30 Сейчас в теме
(62) Поменял. Видимо с офсайтом проблемы...
64. rommario 03.06.11 23:23 Сейчас в теме
Спасибо, материал очень полезный.
На мой взгляд единственным коммерчески приемлемым решением является Yoksel.
Главное его преимущество, что он не требует установки никаких принтеров (скажем на 20 машинах), легко регистрируется и, проверено, работает без проблем.
Для обхода проблемы с высотой страницы я искусственно бью свой большой xls на несколько файлов, все их преобразовываю в pdfы, которые потом объединяю в один файл.
Хотя это конечно нельзя назвать нормальным решением.
Недорогих и тем более бесплатных приемлемых решений для печати в pdf пока, к сожалению, нет.
65. Rustig 1533 01.07.11 12:58 Сейчас в теме
(0) хочу отблагодарить :)
может телефончик напишите?
66. Spartan 348 26.07.11 13:49 Сейчас в теме
(65) Что-то у меня с рассылкой, наверное... не вижу новые комментарии. Да бог с ним - пользуйтесь на здоровье! ;)
67. ARL 299 08.09.11 17:35 Сейчас в теме
У меня проблемы с отработкой строки:
ПереместитьФайл(ФайлPDF.ПолноеИмя, НовоеПолноеИмя) ;
Как понимаю, 1С не "отпускает" первый файл.
Пришлось заменить на
КопироватьФайл(ФайлPDF.ПолноеИмя, НовоеПолноеИмя) ;
При этом не получается печатать массив файлов.
Ни кто не знает, как обойти проблему?
Автору однозначно, благодарность. Наши менеджеры порадовались.
68. Spartan 348 08.09.11 17:50 Сейчас в теме
(67) Если файл "захвачен", то скорее всего не 1С, а виртуальным принтером. Вообще странно - у меня после проверки размера файла таких проблем не возникало. Какие имена получаются при копировании? Можно конечно добавить еще принудительную задержку времени в несколько секунд, но это немного коряво получится. В общем, надо пробовать в конкретной ситуации...
Вообще хорошо бы посмотреть, что блокирует файл... может с правами какие-то нюансы?
69. PGorlov 11.10.11 11:56 Сейчас в теме
Добрый день!
Спасибо за такой пример, но есть одно но! Я совсем не понимаю почему происходит следующее:
1. Все документы, нужные в бумажном виде, печатаем на HP 2727
2. Когда надо в PDF, то запускают мою обработку, включающую ваш способ преобразования в PDF
3. Выбирают необходимые документы
4. Эти документы печатаются в PDF с синей печатью и подписью
5. Отправляются архивом на указанные емейл
6. Затем если снова надо печатать бумажные документы, то печать уходит на PDFCreator

Собственно, правится это путем открытия перед печатью пункта меню: Файл-Параметры Страницы, выставляется нужный принтер и до следующего использования обработки все хорошо, после ее применения опять вместо нужного принтера стоит PDFCreator

Непонятно сие по следующим причинам:
1. Ни кто про это не писал
2. Стоит ведь строка в коде: ТабДок.ИмяПринтера = СтароеИмяПринтера;
3. Если после этой строки добавить: ТабДок.Напечатать(); то старый принтер "запоминается", иначе остается PDFCreator

Буду благодарен, если кто-нибудь подскажет в чем может быть дело.
71. Spartan 348 11.10.11 20:23 Сейчас в теме
(69) Строка ТабДок.ИмяПринтера = СтароеИмяПринтера; была изначально или добавили позже? Если позже, то виртуальный принтер уже мог ранее сохраниться в настройках табличного документа внутри базы. В таком случае необходимо для таких печатных форм установить нужный принтер принудительно - у меня есть где-то для этого обработка. Позже поищу и выложу нужный код, если нужно.
72. PGorlov 12.10.11 04:39 Сейчас в теме
(71)Не, там раньше стоял наш HP 2727, строка уже была в обработке, т.е. по идее измениться ни чего не должно было.
За обработку, которая принудительно назначает нужный принтер буду весьма благодарен!
73. Spartan 348 12.10.11 11:36 Сейчас в теме
(72) Смотрите в сторону параметров печати. Если в вашей конфигурации используется назначение параметров печати при формировании табличного документа (конструкция ТабДок.ИмяПараметровПечати = "<...>"), значит, их настройки сохраняются в базу. В типовых процедурах, как правило, принтер в явном виде не указывается (не используется конструкция вида ТабДок.ИмяПринтера = "<...>"), то есть этот параметр в базу сохраняется пустым, а при печати используется принтер по-умолчанию в системе.
У меня было так: изначально в моей процедуре старое имя принтера (фактически - пустое) табличному документу не возвращалось, соответственно в базу сохранялись параметры с принтером PDFCreator, который и восстанавливался при последующем использовании этой печатной формы. То есть мне нужно было записать в базу пустое имя принтера для таких форм и добавить в процедуру строку ТабДок.ИмяПринтера = СтароеИмяПринтера; чтобы система продолжала работать в типовом режиме.
Обработка элементарная, написана за 5 минут (красиво и универсально делать не старался):
Процедура СброситьПринтерВПараметрахПечати(ТабДокументы)
	
	Для каждого ТабДок Из ТабДокументы Цикл
		ТабДок.ИмяПринтера = "";
	КонецЦикла; 
	
КонецПроцедуры
                                           
Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	Если Не ЗначениеЗаполнено(Документ) Тогда
		Предупреждение("Не выбран документ!", 10, "Ошибка");
		Возврат;
	КонецЕсли; 
	
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
		ДокументОбъект = Документ.ПолучитьОбъект();
		
		СписокМакетов = Новый СписокЗначений();
		СписокМакетов.Добавить("НакладнаяБезГТД");
		СписокМакетов.Добавить(Справочники.ДополнительныеПечатныеФормы.НайтиПоНаименованию("Счет по накладной"));
		
		МассивТабДокументов = Новый Массив;
		Для каждого Элемент Из СписокМакетов Цикл
			ТабДок = ДокументОбъект.ПолучитьПечатнуюФормуДокумента(Элемент.Значение);
			Если ТипЗнч(ТабДок) = Тип("ТабличныйДокумент") Тогда
				МассивТабДокументов.Добавить(ТабДок);
			КонецЕсли; 
		КонецЦикла; 
		СброситьПринтерВПараметрахПечати(МассивТабДокументов);
		Сообщить("Принтер в параметрах печати очищен.", СтатусСообщения.Информация);
	Иначе
		Предупреждение("Для выбранного типа документов сброс принтера в параметрах печати не предусмотрен.", 10);
	КонецЕсли; 
	
КонецПроцедуры
Показать

Как видно из кода, мне нужно было сбросить принтер только для 2-х печатных форм документа Реализация товаров и услуг.
ВАЖНО! Так как настройки параметров печати сохраняются для каждого пользователя отдельно, сброс принтера также должен выполняться для каждого "проблемного" пользователя. После сброса в программу желательно перезайти, чтобы установленные настройки могли сохраниться.

Не знаю, поможет ли это в вашем случае, но в любом случае советую пройтись отладчиком под пользователем с такой проблемой и посмотреть, какие параметры табличного документа получаем после выполнения процедуры печати в pdf, и какое имя принтера сохранено в базе (в типовых должно быть пустое). В крайнем случае попробуйте сохранять имя вашего основного принтера. В общем, нужно экспериментировать.
70. Spartan 348 11.10.11 20:20 Сейчас в теме
74. kolia 23 14.11.11 10:54 Сейчас в теме
Спасибо. Интересная статья. Очень помогла
75. Spartan 348 28.12.11 14:58 Сейчас в теме
Грабли с виртуальными принтерами более неактуальны - в новом релизе платформы 8.2.15.289 добавили поддержку pdf.
Leja; papami; korppinen; Seven2000; +4 Ответить
76. Seven2000 23.03.12 17:54 Сейчас в теме
(75) Спасибо, что открыл глаза!!!

А как из 1С тогда програмно сохранить в ПДФ встроенными средствами?
77. Spartan 348 24.03.12 01:29 Сейчас в теме
(76)
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
79. BoryaMbi 25 08.07.13 08:54 Сейчас в теме
(77)

Считаю публикацию снова актуальной, в связи с ошибкой 1С в кодировках при записи pdf файла:

Известные ошибки версии 8.2.16, планируемые к исправлению в будущих версиях
20006661 (SW707626) Сохранение табличного документа в формате PDF
Проблема:
При сохранении табличного документа в формате PDF, текст, написанный нестандартным шрифтом, сохраняется в PDF некорректно.
Дата публикации:
2012-08-02
http://downloads.v8.1c.ru/content/Platform/8_2_16_362/ErrPlatform_8_2_16_362.htm


Обсуждения:
http://www.forum.mista.ru/topic.php?id=668893
http://www.forum.mista.ru/topic.php?id=647214

Есть ли мысли по этому поводу?
Каким образом можно обходить ошибку?
Или это говорит нам о том, что 1С в вопросах PDF нельзя доверять вообще?
81. Spartan 348 09.07.13 07:39 Сейчас в теме
(79) Даже не знаю, а какие могут быть мысли? Платформа - это черный ящик.. Варианты: не использовать нестандартные шрифты, ждать пока 1С исправят ошибку или пользоваться нетиповыми методами.
(80)
Что я делаю не правильно?

Наверное, пишете в 7-ке..
Йоксель корректно поддерживает(-л) mxl только семерочного формата, поэтому для корректного отображения форм используется промежуточное сохранение в xls. Или что именно Вам кажется "диким"? Оформление кода через Попытку? Так регистрация тут не при чем.. Библиотеки банально может не оказаться на машине, или Вы предлагаете лично это проверить у каждого из 70 пользователей?
82. BoryaMbi 25 09.07.13 11:30 Сейчас в теме
(81)
Просто благодарен за выложенный (так давно) код, т.к. я его с успехом применил для решения данной проблемы.
Можно подробнее, какие необходимо использовать штрифты в табличном документе, чтобы его можно было корректно записать в pdf?
Я перепробовал парочку - ничего не вышло. Просто в итоговом документе - выделил всю таблицу и свойствах указал другой штрифт - Ариал, затем Таймс и т.д. Все тоже самое.
Может еще какую-то кодировку необходимо указывать?
83. Spartan 348 09.07.13 19:56 Сейчас в теме
(82) Честно говоря, сам не сталкивался - узнал об этой ошибке из Вашего поста.. Так что не смогу ничего подсказать, к сожалению. Надо экспериментировать.
84. BoryaMbi 25 09.07.13 23:12 Сейчас в теме
(83)
Ясно. Думаю, что это корректное место для обсуждения данной проблемы.
93. wondermaker 25.06.14 04:40 Сейчас в теме
(75) там актуальны другие грабли :)

Как минимум до платформы 8.2.19.80 есть проблема - если поле "перенасыщено" форматированием (жирный, наклонный, подчеркивание), то при определенных обстоятельства может получиться проблема при сохранении в PDF - файл просто не читается.

Я пока поймал эту ошибку, думал, что поседею.
Причем поймать условия, при которых это происходит (т.е. условия знал, не знал что именно влияет) сложно.
В итоге, убрал в строках подчеркивание из шрифта и всё заработало без проблем.
80. Кошки рулят 09.07.13 03:06 Сейчас в теме
Какой-то дикий код для Йокселя у автора.
Какие-то проблемы с регистрацией? У меня dll регистрации не требует. Что я делаю не правильно?

ИсхТабл = СоздатьОбъект("Таблица"); 
...
...
ИсхТабл.Вывести();
					
ЗагрузитьВнешнююКомпоненту ("SpreadSheet.dll");
					
Таб = СоздатьОбъект ("ТабличныйДокумент");
Таб.ЗагрузитьИзТаблицы (ИсхТабл);
Конвертер = СоздатьОбъект ("Йоксель.ГрафическийКонвертер.PDF");
Конвертер.ВысотаСтраницы = 56.7*297; 
Конвертер.ШиринаСтраницы = 56.7*210;
Конвертер.КоличествоБитНаПиксел = 24;
Конвертер.Документ = Таб;
Конвертер.ПолеСлева = 56.7*15;
Конвертер.ПолеСверху = 56.7*10;
Конвертер.ПолеСправа = 56.7*10;
Конвертер.ПолеСнизу = 56.7*5;    
					
Данные = Конвертер.СтандартныеМетаданные;
Данные.Автор = глПользователь;
Данные.Заголовок = "шлю всем мой крутой документ";
Данные.Тема = "мой крутой документ";
Данные.КлючевыеСлова = "отчет, документ" ;
Данные.ГенераторОригинальногоДокумента = "1С:Клюшки & Кошки рулят";
Данные.ГенераторДокументаPDF = "Йоксель - yoksel.net.ru";
					
Час="";
Минута="";
Секунда="";  
ТекущееВремя(Час,Минута,Секунда);   
					
Данные.УстановитьДатуСоздания (ДатаГод(ТекущаяДата()),ДатаМесяц(ТекущаяДата()),ДатаЧисло(ТекущаяДата()),Час,Минута,Секунда);
Данные.УстановитьДатуМодификации (ДатаГод(ТекущаяДата()),ДатаМесяц(ТекущаяДата()),ДатаЧисло(ТекущаяДата()),Час,Минута,Секунда); 
					
Конвертер.ЗаписатьВФайл (КаталогВременныхФайлов()+"Мой крутой документ.pdf");     
ЗапуститьПриложение(КаталогВременныхФайлов()+"Мой крутой документ.pdf"); 
//ФС.УдалитьФайл(КаталогВременныхФайлов()+"Мой крутой документ.pdf"); 
Показать
85. boss_kuz 90 13.08.13 21:06 Сейчас в теме
На основании этой статьи я сделал рабочую обработку.
Ставьте плюсики :) http://infostart.ru/public/146275/
86. N.Serg 03.12.13 12:24 Сейчас в теме
Добрый день, очень полезная публикация, но есть вопрос. А как заставить PDFCreator создавать один файл с документами печати, а не несколько?
87. Spartan 348 03.12.13 14:27 Сейчас в теме
(86) Формируйте один табличный документ нужного вида, чтобы все, что нужно, было в нем и передавайте на вход процедуры массив с этим документом.
88. N.Serg 03.12.13 16:08 Сейчас в теме
(87) проблема в том что документы могут иметь разный масштаб и ориентацию страницы. табличный документ 1С побороть это не сможет, т.к. параметры страницы задаются для всего табличного документа, плюс ширина колонок будет задана такая как для первого выводимого макета, чтоб сделать различную ширину колонок тоже геморно.
89. Spartan 348 03.12.13 16:38 Сейчас в теме
(88) Тогда не знаю. Не уверен, что это вообще возможно с помощью PDFCreator. Копайте его настройки - я делал это сто лет назад, может чего добавилось/поменялось.
90. N.Serg 03.12.13 16:55 Сейчас в теме
а Вы не помните где брали документацию по работе с этим объектом (его свойства и методы)?
92. farkhod 15 21.02.14 09:39 Сейчас в теме
Хороший листинг, пригодится может каждому
94. szhukov 139 30.10.14 13:10 Сейчас в теме
Не получается в один файл напечатать несколько печатных форм
Подскажите как?
(использую PDFCreator)
там вроде есть, такая функция cCombineAll, но то ли не так пользую, то ли не для этого... :)
95. Spartan 348 30.10.14 22:17 Сейчас в теме
(94) От PDFCreator'а давно отказались. К сожалению, не помогу. Эксперименты с ним проводить некогда.
96. baikalpharm 28.01.15 11:34 Сейчас в теме
Установил принтер PDFCreator, но при выполнение выходит ошибка "Не установлен драйвер принтера PDFCreator!".
Что необходимо еще установить?
97. jorelingo 9 31.01.15 21:03 Сейчас в теме
(96) baikalpharm, необходимо скачать более раннюю версию pdfcreator 1.7.3, тогда все ок
99. ironn 5 20.01.16 16:43 Сейчас в теме
(97) jorelingo, более ранние версии глючные сильно
98. ironn 5 19.01.16 21:46 Сейчас в теме
Намучился с этим PDF Creator, понадобилось сохранять в jpg из 1С 8.2
Оказывается, все зависит от версии.

Для версий до 2.0
УтилитаПечати = Новый COMОбъект("PDFCreator.clsPDFCreator");


Для версий, начиная с 2.0 или 2.1 (у меня 2.1)
PDFCreator= Новый COMОбъект("PDFCreatorBeta.PDFCreatorObj");
PDFCreatorQueue= Новый COMОбъект("PDFCreatorBeta.JobQueue");


А в версии 2.2 уже без Beta
PDFCreator= Новый COMОбъект("PDFCreator.PDFCreatorObj");
PDFCreatorQueue= Новый COMОбъект("PDFCreator.JobQueue");


Методы тоже поменялись, примеры есть на оф. сайте
Если кому интересно, могу подрихтовать и выложить. Сейчас работает для Бух. для Украины.
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    36816    unichkin    46    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    22203    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    20686    John_d    22    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    15444    kuzyara    33    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    29337    tormozit    100    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    16284    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    7887    Sibars    19    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    30325    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    77216    tormozit    131    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    43903    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    45465    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    26246    YPermitin    24    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    47517    tormozit    40    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    24863    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    30116    ids79    16    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    72448    ids79    49    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    43850    tormozit    74    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    31673    avalakh    22    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    21659    json    13    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    53530    ids79    11    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    15860    m-rv    2    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    33878    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    25161    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19302    SeiOkami    50    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    19877    m-rv    17    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    41877    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    49012    ids79    25    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    23970    dmurk    144    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    30001    m-rv    21    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    22125    YPermitin    7    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    40468    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    28441    Eret1k    23    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    27999    itriot11    34    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    34287    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    26573    ellavs    88    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    30424    YPermitin    53    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    75519    Serginio    108    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    36150    Смешной 1С    27    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    20994    Vladimir Litvinenko    27    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    33737    ids79    40    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    36997    ids79    9    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    28889    grumagargler    28    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    25791    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    39601    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    35899    ids79    40    

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

Практика программирования v8 Бесплатно (free)

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

04.09.2017    51819    m-rv    61    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    44158    Unk92    21