Создание динамически подгружаемых печатных форм на 8.2, как это было реализовано в 1С:7.7

28.07.17

Разработка - Механизмы платформы 1С

При создании собственной, легкой, автономной конфигурации для филиалов на управляемых формах необходимо было решить одну задачу: «БЕЗ обновления конфигураций необходимо легко и быстро обновлять/добавлять печатные формы для любого документа в 1С». Очень понравилось ранее существовавшее решение по динамической подгрузке внешних печатных форм в 1С 7.7. Его и реализуем.

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

И так план решения поставленной задачи:

  1. Выделяем каталог где хранятся печатные внешние формы. В нашем случае: «%КаталогБД%/ExtForms/PrnForms»
  2. В данный каталог складываем одноимённые файлы печатной формы ERF и XML с описанием формы, например: «ЗакупочныйАкт.erf» и «ЗакупочныйАкт.xml»
  3. При открытии любой формы документов (справочников) собираются список печатных форм из файлов XML и создаются на форме соответствующие кнопки печать.
  4. При старте формирования печатной формы, загружается внешняя печатная форма и открывается ее форма.

Реализуем:

1. Этап

Создаем константу для хранения каталога печатных форм: «КаталогПечатныхФорм». Тип(«Строка») . Длина(255). Ее, кстати, заполнять не обязательно, если не заполнена будем использовать условленный в плане путь «по умолчанию».

Создаем Общий модуль «_ВнешниеПечатныеФормы» доступный с клиентов и с сервера.

Добавляем функцию:

//Получает каталог Печатных форм
Функция КаталогПечатныхФорм() Экспорт
	СтрКаталогПечатныхФорм = СокрЛП(ОбщегоНазначения.ЗначениеКонстантыПоИмени("КаталогПечатныхФорм"));
	#Если ВебКлиент Тогда
		Если ПустаяСтрока(СтрКаталогПечатныхФорм) Тогда
		СтрКаталогПечатныхФорм = "D:\Filial82\ExtForms\PrnForms\";
		КонецЕсли;
	    Возврат СтрКаталогПечатныхФорм;
	#Иначе
		Если ПустаяСтрока(СтрКаталогПечатныхФорм) Тогда
			СтрКаталогПечатныхФорм = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
			Если ЗначениеЗаполнено(СтрКаталогПечатныхФорм) Тогда    //Файловая версия
				Возврат СтрКаталогПечатныхФорм + ?(Прав(СтрКаталогПечатныхФорм,1)="\","","\")+"ExtForms\PrnForms\";
			Иначе
				СтрКаталогПечатныхФорм = КаталогПрограммы();
				Возврат СтрКаталогПечатныхФорм + ?(Прав(СтрКаталогПечатныхФорм,1)="\","","\")+"ExtForms\PrnForms\";
			КонецЕсли;		
		Иначе	
		    Возврат СтрКаталогПечатныхФорм;
		КонецЕсли;
	#КонецЕсли
КонецФункции

2. Этап

Определяем для себя формат файла XML

Например для печатной формы "Закупочный акт" создаем файл: «ЗакупочныйАкт.xml»

<?xml version="1.0" encoding="windows-1251"?>
<ПечатнаяФорма ИД="ЗакупочныйАкт" ИмяФормы="ЗакупочныйАкт" ИмяВСпискеМеню="Закупочный акт" ИмяКнопки="Закупочный акт" ОтображатьКнопку="Авто" Иконка="Печать">
<СсылкаНаОбъект>ДокументСсылка.ЗакупочныйАкт</СсылкаНаОбъект>
</ПечатнаяФорма>

Добавляем в общий модуль «_ВнешниеПечатныеФормы» функцию получения массива печатных форм для объекта

//Возвращает массив печатных форм
//Пример1: ПолучитьМассивПечатныхФорм("ДокументСсылка","РКО");
//Пример2: ПолучитьМассивПечатныхФорм("СправочникСсылка","Контрагенты");
Функция ПолучитьМассивПечатныхФорм(стрТипОбъекта,стрВидОбъекта) Экспорт
	Перем МассивПечатныхФорм;
	МассивПечатныхФорм=Новый Массив;
	КаталогПечатныхФорм = Новый Файл(КаталогПечатныхФорм());
	Если НЕ КаталогПечатныхФорм.Существует() Тогда
		Сообщить("Каталог печатных форм не существует: "+КаталогПечатныхФорм());
		Возврат МассивПечатныхФорм;
	КонецЕсли;
	Для каждого ФайлXML из НайтиФайлы(КаталогПечатныхФорм.ПолноеИмя,"*.xml",Ложь) 
Цикл
		Попытка
			ФайлERF=Новый Файл(Сред(ФайлXML.ПолноеИмя,1,СтрДлина(ФайлXML.ПолноеИмя)-4)+".erf");
			Если НЕ ФайлERF.Существует() Тогда
				Продолжить;
			КонецЕсли;
			ЧитатьХМЛ = Новый ЧтениеXML;
			ЧитатьХМЛ.ОткрытьФайл(ФайлXML.ПолноеИмя);
			ПостроитьДУМ = Новый ПостроительDOM; 
			ДокументДУМ = ПостроитьДУМ.Прочитать(ЧитатьХМЛ);
			КорневойУзел = ДокументДУМ.ПервыйДочерний;
			Если НЕ КорневойУзел.ЕстьАтрибуты() Тогда
				Продолжить;
			КонецЕсли;
			Если КорневойУзел.ЕстьДочерниеУзлы() Тогда
				Для Каждого УзелСсылкаНаОбъект ИЗ КорневойУзел.ПолучитьЭлементыПоИмени("СсылкаНаОбъект") Цикл
					Если (стрТипОбъекта+"."+стрВидОбъекта = УзелСсылкаНаОбъект.ТекстовоеСодержимое) Тогда
						СтруктураДанныхВМассив = Новый Структура("ТипОбъекта,ВидОбъекта,ФайлПолныйПуть,ИД,ИмяФормы,ИмяВСпискеМеню,ИмяКнопки,ОтображатьКнопку,Иконка");
						СтруктураДанныхВМассив.ТипОбъекта = стрТипОбъекта;
						СтруктураДанныхВМассив.ВидОбъекта = стрВидОбъекта;
						СтруктураДанныхВМассив.ФайлПолныйПуть = ФайлERF.ПолноеИмя;
						СтруктураДанныхВМассив.ИД = КорневойУзел.ПолучитьАтрибут("ИД");
						СтруктураДанныхВМассив.ИмяФормы = КорневойУзел.ПолучитьАтрибут("ИмяФормы");
						СтруктураДанныхВМассив.ИмяВСпискеМеню = КорневойУзел.ПолучитьАтрибут("ИмяВСпискеМеню");
						СтруктураДанныхВМассив.ИмяКнопки = КорневойУзел.ПолучитьАтрибут("ИмяКнопки");
						СтруктураДанныхВМассив.ОтображатьКнопку = КорневойУзел.ПолучитьАтрибут("ОтображатьКнопку");
						СтруктураДанныхВМассив.Иконка = КорневойУзел.ПолучитьАтрибут("Иконка");
					МассивПечатныхФорм.Добавить(СтруктураДанныхВМассив);
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			ПостроитьДУМ = Неопределено;
			ЧитатьХМЛ.Закрыть();
		Исключение
		КонецПопытки;
	КонецЦикла;	 	
	Возврат МассивПечатныхФорм;
КонецФункции

Тут конечно можно все оптимизировать… но это я оставляю для вашего творчества 😉

3. Этап

Добавляем в  модуль  «_ВнешниеПечатныеФормы» процедуру генерации кнопок «Печать», вызываемую с формы документа на основании полученного массива XML из 2 этапа

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

Сюда же прикладываем небольшую заглушку для подхвата иконок на кнопки "Печать"

Функция ПолучитьИконкуКнопки(ИмяИконки)
	Попытка
		Если ИмяИконки="Файл" Тогда
			Возврат БиблиотекаКартинок.Печать;      //Пока так
		Иначе	
			Возврат БиблиотекаКартинок[ИмяИконки];
		КонецЕсли;
	Исключение
		Возврат БиблиотекаКартинок.Печать;
	КонецПопытки;
КонецФункции

4. Этап

Теперь во всех формах документов добавляем следующий код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	//необходимо для генерации кнопок печать на форме
	МассивПечатныхФорм=_ВнешниеПечатныеФормы.ПолучитьМассивПечатныхФорм("ДокументСсылка",Объект.Ссылка.Метаданные().Имя);
	_ВнешниеПечатныеФормы.СоздатьКнопкиПечатныхФорм(МассивПечатныхФорм,ЭтаФорма,Элементы,Команды);
КонецПроцедуры

//ВНЕШНИЕ ПЕЧАТНЫЕ ФОРМЫ
&НаКлиенте
Функция ПроверкаНаЗаписьПередПечатью(ЭтаФорма) Экспорт
              //тут ваши проверки перед печатью
              //…
	Возврат Истина;  //или Ложь если не разрешить печать
КонецФункции

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
	Возврат ВнешниеОтчеты.Подключить(АдресХранилища,,Ложь);
КонецФункции 

&НаСервере
Функция ПолучитьМассив()
	Возврат _ВнешниеПечатныеФормы.ПолучитьМассивПечатныхФорм("ДокументСсылка",Объект.Ссылка.Метаданные().Имя); 
КонецФункции

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

В модуль объекта добавляем экспортную процедуру «Печать»:

Функция Печать() Экспорт
   ТабДокумент = Новый ТабличныйДокумент
   //….
   Возврат  ТабДокумент;
КонецФункции

И в модуль формы внешней печатной формы добавляем:

&НаСервере
Функция ВызватьПечать()
	ЭтотОбъект = РеквизитФормыВЗначение("Отчет");
	ТабДок = ЭтотОбъект.Печать();
	Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ТабДок = ВызватьПечать();
	ТабДок.ОтображатьСетку = Ложь;
	ТабДок.Защита = Ложь;
	ТабДок.ТолькоПросмотр = Ложь;
	ТабДок.ОтображатьЗаголовки = Ложь;
	ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
	ТабДок.АвтоМасштаб = Истина;
	ТабДок.Показать();
	Отказ = Истина;
КонецПроцедуры

В принципе готово.
В справочниках все тоже самое, только вместо слов «ДокументСсылка» ставим «СправочникСсылка».

Работает эта система уже несколько лет, с 2013 года без сбоев. А если учесть то, что печатные формы, из-за постоянного изменения законодательства, приходится менять(добавлять) чуть ли не квартал, то такой подход сохранил нам много времени на обновлениях при 160 филиалах.

PS/ На дополнительные вопросы, включая вопросы о причинах наших поступков и решений, буду отвечать в комментариях .

Печать внешняя xml

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4590    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5304    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6432    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18495    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12105    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8845    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6284    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16005    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. platon_ 10 28.07.17 17:15 Сейчас в теме
А чем Механизм Внешних Печатных Форм из БСП не устроил?
3. dima_home 238 29.07.17 10:50 Сейчас в теме
(1) Антон.
Давайте с начало рассмотрим различия:
1. Наша реализация: При открытии формы документа каждый раз заново собираются печатные формы из локального каталога.
Реализация БСП: Для подключения нужно зайти в 1С (администратору) и подгрузить печатную форму.
2. Наша реализация: С помощью ftp или dropbox можно синхронизировать печатные формы сразу в 160 филиалах (с полностью автономными 1С - не РИБ)
Реализация БСП: Нужно подключаться в каждую 1С и подгружать форму вручную либо организовывать РИБ.
3. Наша реализация: Позволяет указывать кнопке печатной формы, где она должна быть: в раскрывающимся списке печать или в виде отдельной кнопки прямо на форме. Позволяет менять иконку, в планах было даже подгружать любую иконку, даже динамически с диска.
Реализация БСП: Печатные формы только в список (но возможно я не прав).

А теперь рассмотрим условия, в которых все делалось:
1. 2013 год (управляемые формы только входили в оборот).
2. Все филиалы находятся не в городе, а по селам. Интернет во многих филиалах – очень нестабильное GPRS соединение с ограниченным объемам трафика в день (Москвичам не понять этого со своим 3G и 4G).
3. Не всегда удается даже удаленно подключиться по UVNC с максимальным сжатием (2х битный цвет) , не говоря уже чтобы удаленно подключаться администратору и работать в 1С.
4. В некоторых филиалах обновление 1С - это отправка флэшек с автозапуском копирования файла cf в заранее прописанный каталог, и при перезагрузке компьютера автоматическое обновление 1С из cf.
5. Ни при каких обстоятельствах не должны останавливаться продажи на долго.
6. Конфигурация для филиалов делалась с нуля, исключительно заточенной под наши задачи. Стандартные решения от 1С тихо курят в сторонке ;).

Выводы:
1. RDP не приемлем. Нет связи, а ее иногда не было целыми неделями, нет продаж.
2. РИБ (есть опыт - могу поделится но уже отдельно) при изменениях конфигурации, или при массовых действиях с данными может тоже приводить к коллапсу обмена и к неработоспособности 1С филиала.
3. Подключение администратора удаленно для добавления печатных форм (как при БСП) в виду количества филиалов и низкого качества связи является не лучшим решением.
4. Местные сотрудники, работающие в региональных филиалах , как правило не могут отличить монитор от системного блока, и просить их что либо делать с 1С та еще задача ;)

В итоге:
Идеальным решением было - организовать обмен с филиалом через негарантированную связь, с защитой от порченных файлов, с поддержкой скачивания частями, по пассив FTP. Пытались даже аналог dropbox прикрутить, не взлетело, были случаи когда файлы просто отказывались синхронизироваться или просто исчезали.
Соответственно, когда по FTP приходили печатные формы в архиве, они при перезагрузке компьютера, при удачном разархивировании (защита от порчи файлов при передачи), копировались в папку с PrnForms. А 1С автоматом их подхватывала.
Аналогичное решение применяли к всякого рода дополнительным файлам (инструкциям) доступным из 1С.

Думаю наше решение (возможно не реализация) было самым оптимальным.
sbcode; juricher; suepifanov; +3 Ответить
2. CheBurator 3119 29.07.17 01:14 Сейчас в теме
В настроечные иксемель файлы можно пихать еще всякие ограничения, типа
Кроме="тутпереченьгуидовконтрагентовккоторымнеприменяетсядан­наяпечформа"

в той же 77 недостатком ВПФ является то что они не делятся на ОТЧЕТЫ (не изменяют базу) и ОБРАБОТКИ (изменяют базу). по уму - ВПФ должны быть разделены на "ПЕЧФОРМЫ" и "ДЕЙСТВИЯ" (действия могут тоже формировать печформы, но это побочный плюс действий).
4. dima_home 238 29.07.17 10:56 Сейчас в теме
(2) Сергей. Конечно я в статье описал только пример для печатных форм.
У нас конечно были реализованы и погрузка самовыполняемых задач в 1С. И в 1С был раздел дополнительные возможности куда налету подцеплялись инструкции, и иные общие формы (не под документы) типа: xls/doc,pdf,html,erf,epf.
Прикрепленные файлы:
5. dima_home 238 29.07.17 11:11 Сейчас в теме
Сразу отвечу на будущие вопросы: "Почему не использовали стандартные 1С, а занялись своей разработкой".

Основная причина: Неконтролируемый рост размеров стандартных конфигураций, и их неудержимые попытки занять весь интернет канал, пытаясь "слить/залить что-то" в/из 1С.
У нас например в одном филиале: база живет с 2013 года. Ее размер 108 Мбайт, при среднем 30000 документов в год по рознице и 5000 документов в год по оптовым продажам. При этом почти половина размера базы занимает стандартный классификатор адресов. Все это крутится(летает) на обычном пентиуме (P4).
Вторая причина: В любую секунду можно выбросить жесткий диск с 1С в филиале и установить пустую базу, начальные остатки (не путать с восстановлением старых документов) и настройки можно выгрузить из центральной базы, при этом это никак не скажется на возможности учета (даже в части возврата прошлых продаж)...
и ее много других решений, на много опередивших стандартные решения от 1С.
juricher; +1 Ответить
6. Vortigaunt 96 09.08.17 12:40 Сейчас в теме
(5) Заинтересовало, каким образом реализован обмен между центральной базой и филиалами?
7. dima_home 238 13.08.17 21:39 Сейчас в теме
На FTP сервере (в локальной сети с головной базой 1С) создаются две папки IN_FILIAL и OUT_FILIAL
На компьютере филиала создаются локальные аналогичные папки.
Каждый N-час со стороны филиала инициируется передача файлов из "LOCAL\OUT_FILIAL" в
"FTP\N_FILIAL\OUT_FILIAL" и забор файла из "FTP\N_FILIAL\IN_FILIAL" в "LOCAL\IN_FILIAL".
Файлы могут быть XML/ZIP, ZIP файлы автоматически разворачиваются по окончанию загрузки. Используются возможности докачки файла. При неудачном получении/отправки файл удаляется в приемнике и его передача начинается званого в следующем сеансе.
Всегда приоритет на обмен XML файлами, при их отсутствии принимаются ZIP - это позволяет избежать заторы обмена важных данных, если вдруг крупный файл ZIP не удается передать.
Прикреплю выдержку из инструкции по работе с обменом в филиале.

Теперь виды файлов:
Из Головы в филиал:
NMK - Номенклатура - в виде txt файла, так как это самый большой файл (65к наименований номенклатуры) и XML такого размера 1С просто не может переварить. При передаче файл zip-пуется;
CEN - Цены на номенклатуру - xml
DDS- ВыпискаБанка- xml
DIS- дисконтные карты- xml
FIO- физ лица сотрудников (для подотчета)- xml
INV- документы инвентаризации - xml
SOS- состыковка контрагентов (про контрагентов надо отдельную тему создавать про их состыковку и обмен.)
...ну и так далее не буду все перечислять... каждого вида документа есть свой вид файла xml

Из филиала в голову:
Также все документы выгружаются в отдельные файлы xml. Кроме розницы, розница выгружается по закрытию торгового дня.

Файлы создаются каждый раз при проведении документов в каталоге "LOCAL\OUT_FILIAL" в базе филиала, и в каталоге "FTP\N_FILIAL\IN_FILIAL" в головной базе. Если проводится один и тот же документ, файл перезаписывается.

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

Но некоторые файлы могут бегать в обе стороны...например "реализация оптовая (торг-12)"... ее можно создать в филиале, затем исправить в голове. Задачи соответствия документов при одновременном проведении сводится к назначению последней руки - т.е. всегда когда проводится документ реализации в филиале (в ручную или при приеме документа из головы) происходит выгрузки документа из филиала в голову, при этом когда голова принимает документ, выгрузка в филиал не происходит.

Что касается согласования справочников.
Номенклатура/сотрудники/цены/дисконт только из головы, так что здесь нет проблем, а вот справочник контрагентов - целая система сопоставления независимых справочников (наше ноу-хау). Контрагенты могут создаваться раздельно или одновременно на любой стороне и будут все равно связаны.

Любые документы (в любую сторону) можно заказывать повторно и загружать поверх.

Еще, для отслеживания расхождений в базах, при закрытии торгового дня отправляется автоматически отправляется из филиала сверка остатков товаров, продаж...при наличии расхождений уведомляется менеджер филиала.
Прикрепленные файлы:
Обмен.pdf
8. dima_home 238 14.08.17 14:51 Сейчас в теме
Вот пример файла xml, все ценное заменено *****
Прикрепленные файлы:
8_GLV_RNK_20170404_117.xml
Оставьте свое сообщение