Этюды по программированию. Взаимодействие с Microsoft Word

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

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

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

Этюды по программированию. Взаимодействие с Microsoft Word.

 

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

 

Получение шаблона.

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

Файл можно найти по имени, или прикрепить  как дополнительный реквизит к справочникам и документам. (При создании дополнительного реквизита указать тип “Файл”).

Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДополнительныеСведения.Значение КАК Значение
	|ИЗ
	|	РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
	|ГДЕ
	|	ДополнительныеСведения.Свойство.Наименование = &Наименование
	|	И ДополнительныеСведения.Объект = &Ссылка";
	
	Запрос.УстановитьПараметр("Ссылка", ДанныеПечати.Партнер);// Укажите ваш объект с прикрепленным дополнительным реквизитом шаблона.

	Запрос.УстановитьПараметр("Наименование", "Шаблон спецификации (Сделки с клиентами)"); //Укажите ваше название реквизита
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если  ВыборкаДетальныеЗаписи.Следующий() Тогда
		Файл= ВыборкаДетальныеЗаписи.Значение;
		ДанныеФайлаИДвоичныеДанные = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(Файл);
		
		ДанныеФайла = ДанныеФайлаИДвоичныеДанные.ДанныеФайла;
		ДвоичныеДанные = ДанныеФайлаИДвоичныеДанные.ДвоичныеДанные;
		ИмяВременногоФайла = КаталогВременныхФайлов()+"макет.mxl";
		ДвоичныеДанные.Записать(ИмяВременногоФайла);
		Макет =Новый ТабличныйДокумент;
		Макет.Прочитать(ИмяВременногоФайла); 
		КонецЕсли;
	КонецЕсли;


Открытие объекта  документа из временного файла.

       Word = Новый COMОбъект("Word.Application");
                Попытка
                               док = Word.Documents.Open(ИмяВременногоФайла);
                               Док.SaveAs(ИмяВременногоФайла);
                Исключение
                               СообщениеОбОшибке = НСтр("Файл шаблона, указанный в константе, не найден: "+ИмяВременногоФайла+"
                                                              |Подробности:'")
                                                   + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
                               Word.Quit();
                               ВызватьИсключение СообщениеОбОшибке;
                КонецПопытки;
                РабочийКаталогПользователя = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя();
               
               
                Word.Visible = 1;
                Word.Options.CheckSpellingAsYouType = 0;
                Word.Options.CheckGrammarAsYouType =  0;
                Word.Options.CheckGrammarWithSpelling =  0;
                Selection = Word.Selection;

         Работа с таблицами по  макету таблицы:

          1. Макет таблицы. Создаем файл с шаблоном WORD. В файле должна быть таблица с шапкой, пустой строкой и (опционально) подвалом, например следующего вида:

    1. Поиск нужной таблицы в документе. Так как в документе обычно много таблиц, нужную таблицу нужно найти и заполнить
    Для Каждого Таб из док.Tables цикл
    Если СтрНайти(Таб.Cell(1, 1).Range.Text,"№")>0 И СтрНайти(Таб.Cell(1, 2).Range.Text,"Наименование")>0 Тогда
    //… Заполнение таблицы
           ТЗ= ПолучитьТЧТовары(Объект.СсылкаНаОбъект);
                           Таб.Rows(Таб.Rows.Count).Select();  //Выделям строку, на место которой будем вставлять новые строки
                           //Таб.Rows(1).Select(); 
                           Строка=Таб.Rows.Count;
                           Итерация=1;
                           Для Каждого стр Из ТЗ Цикл
                                           Если Итерация>1 Тогда
                                                          Selection.InsertRowsBelow( 1); //
                                           КонецЕсли;
                                           Таб.Cell(Строка, 1).Range.Text = стр.НомерСтроки;
                                           Таб.Cell(Строка, 2).Range.Text = стр.НоменклатураНаименование+" "+ТекстовоеОписаниеБезКомплектации(стр.ТекстовоеОписание);
                                           Таб.Cell(Строка, 2).Range.Paragraphs.Alignment = 0;
                                           текКол = ?(стр.Количество = 0,1,стр.Количество );
                                           Таб.Cell(Строка, 3).Range.Text =?((стр.ЦенаВключаетНДС), Формат((стр.Сумма - стр.СуммаНДС), "ЧДЦ=2"),Формат(стр.Сумма, "ЧДЦ=2"));
                                           Таб.Cell(Строка, 3).Range.Paragraphs.Alignment = 1;   
                                           Таб.Cell(Строка, 4).Range.Text =Формат(стр.СуммаНДС, "ЧДЦ=2");
                                           Таб.Cell(Строка, 4).Range.Paragraphs.Alignment = 1;   
                                           Таб.Cell(Строка, 5).Range.Text = ?((стр.ЦенаВключаетНДС), Формат((стр.Сумма ), "ЧДЦ=2"),Формат((стр.Сумма+ стр.СуммаНДС), "ЧДЦ=2"));
                                           Таб.Cell(Строка, 5).Range.Paragraphs.Alignment = 1;   
                                           Строка = Строка + 1;
                                          Итерация=Итерация+1;
                           КонецЦикла;
           КонецЦикла;
    

       Работа с таблицами 2. Вставляем невидимую таблицу по месту закладки:

  1.  

    Очень часто нужно вставить невидимую таблицу в ячейку другой таблицы, например для вывода номенклатуры и количества: 

              
    	Если Док.Bookmarks.Exists("ТаблицаПродукции") Тогда
    		Поз = Док.GoTo(-1,,, "ТаблицаПродукции");
    		Колонок = 2;
    		Таб = Док.Tables.Add(Поз, 1, Колонок);
    		//Таб.Cell(1, 1).Range.Text = "Наименование";
    		//Таб.Cell(1, 2).Range.Text = "Кол-во";
    		//Таб.Cell(1, 3).Range.Text = "Ед.";
    		Таб.Range.Paragraphs.Alignment = 1;
    		Таб.Columns(1).Width=270;
    		Таб.Columns(2).Width=80;
    		Строка = 1;
    		Для Каждого стр Из ДанныеПоБП.НоменклатураБрак Цикл
    			Таб.Rows.Add();
    			Таб.Cell(Строка, 1).Range.Text = стр.Наименование;
    			Таб.Cell(Строка, 2).Range.Text =""+ стр.КоличествоБрака+"";
    			Таб.Cell(Строка, 2).Range.Paragraphs.Alignment = 0;
    			Строка = Строка + 1;
    		КонецЦикла;
    	КонецЕсли;

     

  2. Вставляем фрагмент из другого документа WORD:
  3. Обеспечиваем в нужном месте шаблона закладку.Процедура для вставки фрагмента:
    1. Процедура ВставитьПодшаблонИзСправочникаФайл(ИмяЗакладки,Word)
             Selection = Word.Selection;
             Для Каждого Закладка из Word.ActiveDocument.Bookmarks Цикл
                             Если Найти(Закладка.Name,ИмяЗакладки) Тогда
                                             Файл = НайтиФайлПодшаблонаНаСервере();
                                             Если ЗначениеЗаполнено(Файл) Тогда
                                                            ДанныеФайлаИДвоичныеДанные = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(Файл);
                                                            ДанныеФайла = ДанныеФайлаИДвоичныеДанные.ДанныеФайла;
                                                            ДвоичныеДанные = ДанныеФайлаИДвоичныеДанные.ДвоичныеДанные;
                                                            Попытка
                                                                            ИмяВременногоФайлаШаблона = КаталогВременныхФайлов()+"Шкафы КРУ сборка1.doc";
                                                                            ДвоичныеДанные.Записать(ИмяВременногоФайлаШаблона);
                                                            Исключение
                                                                            Попытка
                                                                                            ИмяВременногоФайлаШаблона = КаталогВременныхФайлов()+"Шкафы КРУ сборка2.doc";
                                                                                            ДвоичныеДанные.Записать(ИмяВременногоФайлаШаблона);
                                                                            Исключение
                                                                            КонецПопытки;
                                                            КонецПопытки;
                                                           
                                                           
                                                            Ворд2 = Новый COMОбъект("Word.Application");
                                                            Попытка
                                                                            док2 = Ворд2.Documents.Open(ИмяВременногоФайлаШаблона);
                                                                            НомерСтрокиТаб=3;
                                                                            Для Каждого Таб из док2.Tables цикл
                                                                            //заполняем таблицу        
                                                                            КонецЦикла;
                                                                           
                                                                            Ворд2.ActiveDocument.Select();
                                                                            Ворд2.Selection.Copy();
                                                                            Закладка.Range.Select();
                                                                            Selection.paste();
                                                                            Ворд2.ActiveDocument.Close(0);
                                                                            Ворд2.Quit();
                                                            Исключение
                                                                            ПредупреждениеСерв("Файл  не найден: "+ИмяВременногоФайлаШаблона);
                                                                            Ворд2.Quit();
                                                            КонецПопытки;
                                                            Попытка
                                                                            УдалитьФайлы(ИмяВременногоФайлаШаблона); 
                                                            Исключение
                                                                            ПредупреждениеСерв(ОписаниеОшибки());
                                                            КонецПопытки;
                                             КонецЕсли;
                             КонецЕсли;
             КонецЦикла;
      КонецПроцедуры
      Замена текста шаблона на нужный нам текст WORD:
      1. Предназначенный для замены текст шаблона ограничиваем квадратными скобками. Вместо текста пишем название маркера, по которому мы будем находить этот фрагмент.
      2.  В 1С создаем таблицу маркеров, которая будет содержать два обязательных поля “ Маркер” и “Значение”

Вызываем следующий код:

         Для Каждого стр Из Маркеры Цикл
                              Если ТипЗнч(стр.Значение) = Тип("Дата") Тогда
                                              Значение = СокрЛП(Формат(стр.Значение, "ДФ=""dd.MM.yyyy 'г.'"""));
                              Иначе
                                              Значение = СокрЛП(стр.Значение);
                              КонецЕсли;
                               док.content.find.execute("["+стр.Маркер+"]",,,,,,,,, Строка(Значение), 2);
                               док.Sections(1).Headers(1).Range.Find.Execute("["+стр.Маркер+"]",,,,,,,,, Строка(Значение), 2);
         КонецЦикла;
Вставка рисунка из макета:
  1. Создаем в конфигураторе макет-двоичные данные, в него загружаем нужный рисунок.
  2. Вызываем функцию, текст которой приведен ниже. В качестве аргумента selection удобно передавать выделение ячейки таблицы, это позволяет красиво расположить рисунок в тексте. Сама таблица может быть и невидимой. Например, следующий вызов:
 

///...

ВставитьМакет( Док,Таб.Cell(Строка, 3).Range, ИмяМакета);  

///...

&НаКлиенте

Функция ВставитьМакет( Знач Док,Знач Selection,Знач ИмяМакета)

               Перем Picture, Shape;

               Попытка

                               ИмяВременногоФайла= СохранитьМакетВоВременныйФайл(ИмяМакета);                            

                               Picture = Selection.InlineShapes.AddPicture(ИмяВременногоФайла,, Истина);

                               //Picture.LockAspectRatio = -1;      //сохрняем пропорции

                           Picture.Height= 150;

                               Picture.Width  = 150;              //устанавливаем ширину

                         // Чтобы установить обтекание текста, конвертируем рисунок в фигуру

                                  Shape = Picture.ConvertToShape();

                            Shape.WrapFormat.Type = 5;// перед текстом...

               Исключение

                               Сообщить("Не удалось подгрузить временный файл:"+ИмяВременногоФайла);

               КонецПопытки;

               Попытка

               УдалитьФайлы(ИмяВременногоФайла);

               Исключение

                               Сообщить("Не удалось удалить временный файл:"+ИмяВременногоФайла+"

                               |"+ОписаниеОшибки());

               КонецПопытки;

               // Зададим размер

               Возврат Selection;

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

P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vladismi 161 12.12.17 11:27 Сейчас в теме
Запомним как упорядочение приемов.
Однако предложенное 1С использование копипаста втыкает в файл-приемник всю ту грязь, которую пользователь копирует у себя пока программа готовит вордовый документ...
"А мужики то не знают"...
:(
ger_kar; YPermitin; +2 Ответить
15. sulitckaja 22.02.18 06:30 Сейчас в теме
Может сможет подсказать кто, как в документе Word скопировать и вставить ниже уже существующую таблицу.
Делаю так:
Шаблон = Новый COMОбъект("Word.Application");
Шаблон.Documents.Open(ИмяФайлаПолное); 
Шаблон.Application.Documents(1).Content.Tables(1).Range.Copy();
Шаблон.Application.Documents(1).Content.InsertParagraphAfter();
Шаблон.Application.Documents(1).Content.Paste();


В результате таблица копируется но весь текст и предыдущая таблица исчезает.
16. wonderboy 214 22.02.18 07:41 Сейчас в теме
(15) Предполагаю что Content.Paste() делает вставку вместо всего контента. Вам наверное нужно вставить вместо последнего параграфа, который вы добавили.
Что-то вроде
КоличествоПараграфов = Шаблон.Application.Documents(1).Paragraphs.Count;
Шаблон.Application.Documents(1).Paragraphs(КоличествоПараграфов-1).Range.Paste()
sulitckaja; +1 Ответить
17. sulitckaja 22.02.18 08:01 Сейчас в теме
(16)Спасибо большое. Сейчас попробую.
18. sulitckaja 22.02.18 08:19 Сейчас в теме
(16)
КоличествоПараграфов = Шаблон.Application.Documents(1).Paragraphs.Count;
Шаблон.Application.Documents(1).Paragraphs(КоличествоПараграфов-1).Range.Paste()

(16)
Все получилось! А можно еще один вопрос? Как сделать так, чтобы таблица копировалась с нового листа?
19. wonderboy 214 22.02.18 09:06 Сейчас в теме
(18) Я вам с ходу не подскажу. Наверное что-то вроде

Шаблон.Application.Documents(1).Selection.EndKey(6);
Шаблон.Application.Documents(1).Selection.InsertBreak();

перед добавление параграфа.
sulitckaja; +1 Ответить
20. sulitckaja 22.02.18 09:24 Сейчас в теме
21. rmarkovych 6 05.02.19 15:58 Сейчас в теме
Спасибо автору.
Хотелось бы еще добавить (может кому пригодиться) поиск и замену колонтитулов в макете Word:
MSWord = Новый COMОбъект("Word.Application");
MSWord.ActiveDocument.Sections(1).Headers(1).Range.Find.Execute("<ТекстИскомогоКолонтитула>",,,,,,-1,,,<НужныйТекст>, 2); - верхний
MSWord.ActiveDocument.Sections(1).Footers(1).Range.Find.Execute("<ТекстИскомогоКолонтитула>",,,,,,-1,,,<НужныйТекст>, 2); - нижний
2. 🅵🅾️🆇 12.12.17 16:23 Сейчас в теме
Вся эта объектная модель взаимодействия требует установленного ворда.
Была у меня идейка извратиться и написать взаимодействие с Word'овскими макетами через ЧтениеДанных для простых задач.
Работать должно в разы быстрее и не требовать офиса.

Раньше также делал дикую вложенность как у вас:
Для Каждого Закладка из Word.ActiveDocument.Bookmarks Цикл
	Если Найти(Закладка.Name,ИмяЗакладки) Тогда
		Если ЗначениеЗаполнено(Файл) Тогда
			...
		КонецЕсли; // Если ЗначениеЗаполнено(Файл)
	КонецЕсли; // Если Найти(Закладка.Name,ИмяЗакладки)
КонецЦикла; // Для Каждого Закладка из Word.ActiveDocument.Bookmarks
Показать


Попробуйте такую запись, она легче читается:
Для Каждого Закладка из Word.ActiveDocument.Bookmarks Цикл
	Если Не Найти() Тогда Продолжить КонецЕсли;
	Если Не ЗначениеЗаполнено(Файл) Тогда Продолжить КонецЕсли;
	...
КонецЦикла; // Для Каждого Закладка из Word.ActiveDocument.Bookmarks


Можно и от цикла избавиться с помощью рекурсивных процедур или goto, но это уже извращение)))
ger_kar; vz1987; sansys; biformatus; +4 Ответить
4. cool.vlad4 45 13.12.17 01:21 Сейчас в теме
(2) (3) я писал COM сервер на C# по прикручиванию https://habrahabr.ru/post/269307/ , работает быстрее некуда, работает на сервере, из минусов только, что нужно особым образом делать шаблоны и нет универсальности, поэтому и не выкладываю
5. 🅵🅾️🆇 13.12.17 09:30 Сейчас в теме
(4) Здорово, но все еще медленнее чем чтение из потока двоичных данных)
3. s_vidyakin 12.12.17 17:37 Сейчас в теме
Я сделал с полпинка на node.js - передаешь по GET или POST набор параметров "Ключ:Значение" и имя шаблона, в 1С приходит готовый docx, удобно когда на сервере нет офиса или COMОбъект не работал как у нас (наверно 64битность имеет значение)
6. Rustig 1531 13.12.17 22:37 Сейчас в теме
автор "собаку съел" на шаблонах Word и автоматизации взаимодействия 1с и Word
респект
7. wonderboy 214 18.01.18 10:04 Сейчас в теме
Если разрешите - несколько замечаний / дополнений:

1. Вы закладку ищете в цикле. Это лучше делать так:

Если WordFile.Bookmarks.exists(ИмяЗакладки) Тогда
	ТекЗакладка = WordFile.Bookmarks.Item(ИмяЗакладки);
...


2. По замене маркеров на нужный текст
У Вас предлагается поиск и замена, но не учитывается, что таким образом можно вставить текст только до 250 символов
Если текст больше - будет исключение. Приходится его разбивать на части и вставлять кусками - так было реализовано в 1С: Документообороте раньше.
Сейчас в БСП сделано концептуально правильно. См. общий модуль УправлениеПечатьюMSWordКлиент, процедура Заменить. Через Selection.TypeText(...).

И я бы рекомендовал использовать все же закладки. В Word-документе кроме основного контента и колонтитулов есть еще и другие Story (например, текст в надписях графических объектов). В каждой Story нужно отдельно поиск выполнять.

Есть универсальное решение
https://infostart.ru/public/662990/

Отлаженное, на его внедрениях тоже много Word'овских собак съедено :)
Serg O.; milkers; +2 Ответить
8. Serg O. 187 19.01.18 11:49 Сейчас в теме
Хорошая статья и бесплатная !
9. rpgshnik 2217 14.02.18 10:54 Сейчас в теме
Добрый день.
Смотрю вы работали плотно с WORD, может знаете как программно через 1С задать стиль всему документу по умолчанию 2003, вместо 2010?
10. milkers 2414 14.02.18 11:03 Сейчас в теме
(9) Нет, не приходилось сталкиваться. Может кто-нибудь из коллег подскажет.
11. wonderboy 214 15.02.18 09:01 Сейчас в теме
(9) Дмитрий, а как бы вы это вручную сделали?
12. rpgshnik 2217 15.02.18 09:32 Сейчас в теме
(11) в ручную просто. Скриншот прилагаю.
Прикрепленные файлы:
13. wonderboy 214 15.02.18 10:49 Сейчас в теме
(12) Если знаете как сделать вручную - тогда включаете запись макроса, выполняете действие, останавливаете запись. Потом этот макрос открываете, смотрите как на VB эти действия делаются. Обычно этот код можно из 1С выполнить (с небольшими адаптациями).

Вот для вашего случая что получилось:
ActiveDocument.ApplyQuickStyleSet ("Word 2003")
14. rpgshnik 2217 15.02.18 11:53 Сейчас в теме
(13) спасибо за идею!
Но решил отказаться от типового функционала по разбору ворда. Написать свой.
Я как понял баг заключался в том, что типовой функционал копирует участок текста и вставляет в свежий открытый документ. И естественно слитают стили. Но я ведь не могу всегда быть увереным что будет точно 2003... по этому буду как автор публикации ваят свой парсер ворда.
Хотя почти во всех конфигах даже старых типа КА1.1 есть модули по работе с шаблонами ворда. Эх.
22. coollerinc 40 06.02.19 13:25 Сейчас в теме
Зачем в типовом механизме пользовательских шаблонов делают через копирование шаблона? например при копировании не копируются оформление страницы. Сейчас придется изобретать велосипед
23. bercut0077 3 19.07.19 05:47 Сейчас в теме
Спасибо! Отличная статья. Вопрос автору - как можно вставить из файла HTML в Word информацию (с конвертацией)
Оставьте свое сообщение

См. также

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

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

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

10.12.2016    36755    unichkin    46    

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

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

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

27.01.2020    21673    ids79    26    

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

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

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

15.01.2020    20323    John_d    22    

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

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

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

30.12.2019    15156    kuzyara    33    

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

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

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

15.10.2018    29246    tormozit    100    

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

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

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

02.12.2019    16200    YPermitin    72    

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

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

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

22.11.2019    7815    Sibars    19    

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

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

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

01.10.2019    29981    Yashazz    46    

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

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

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

20.09.2012    77166    tormozit    131    

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

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

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

06.09.2019    43270    rpgshnik    63    

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

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

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

05.09.2019    45005    ids79    54    

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

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

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

05.09.2019    26009    YPermitin    24    

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

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

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

11.07.2007    47451    tormozit    40    

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

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

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

03.09.2019    24785    YPermitin    80    

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

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

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

17.08.2019    29961    ids79    16    

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

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

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

08.08.2019    71223    ids79    49    

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

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

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

10.09.2017    43700    tormozit    74    

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

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

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

02.08.2019    31309    avalakh    22    

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

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

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

31.07.2019    21406    json    13    

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

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

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

26.07.2019    52753    ids79    11    

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

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

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

25.04.2019    15837    m-rv    2    

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

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

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

17.07.2019    33627    ids79    27    

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

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

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

09.07.2019    25057    YPermitin    13    

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

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

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

04.07.2019    19262    SeiOkami    50    

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

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

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

16.04.2019    19816    m-rv    17    

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

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

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

02.07.2019    41211    ids79    17    

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

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

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

25.06.2019    48575    ids79    25    

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

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

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

11.06.2019    23897    dmurk    144    

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

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

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

01.06.2018    29914    m-rv    21    

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

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

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

22.05.2019    21787    YPermitin    7    

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

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

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

16.05.2019    40240    YPermitin    30    

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

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

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

11.05.2019    28308    Eret1k    23    

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

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

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

05.12.2017    27978    itriot11    34    

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

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

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

07.04.2019    34064    ellavs    126    

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

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

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

28.03.2019    26463    ellavs    88    

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

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

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

14.03.2019    30279    YPermitin    53    

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

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

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

27.01.2016    75392    Serginio    108    

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

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

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

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

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

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

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

26.02.2019    20882    Vladimir Litvinenko    27    

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

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

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

10.11.2018    33615    ids79    40    

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

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

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

03.02.2019    36611    ids79    9    

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

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

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

25.07.2018    28837    grumagargler    28    

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

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

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

26.12.2018    25684    ids79    31    

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

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

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

14.12.2018    39404    ids79    72    

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

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

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

16.11.2018    35764    ids79    40    

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

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

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

04.09.2017    51720    m-rv    61    

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

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

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

13.11.2018    43723    Unk92    21