Полное копирование одной формы в другую

Публикация № 1119142 03.10.19

Разработка - Универсальные функции

Управляемая форма внешняя обработка элементы копирование добавление

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

Возможные варианты использования:

  • У вас есть документ, вам надо что-то в нем поменять, но срабатывает событие "при изменении" и едут суммы. Во внешней форме можно это сделать без обработчиков событий.
  • Вам нужно заполнить реквизит формы (не объекта). Групповое изменение реквизитов работает с объектами, а не с данными формы.
  • Нужно изменить заблокированные реквизиты формы (серенькие).

Изначально идея была такова (упрощенно):

ФормаИсточник = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");
ФормаПриемник = ПолучитьФорму("ВнешняяОбработка.с_ЗаполнениеИзВнешнейФормы.Форма");

Для Каждого ЭлементИсточник Из ФормаИсточник.Элементы Цикл
	
	ЭлементПриемник = ФормаПриемник.Элементы.Добавить(ЭлементИсточник.Имя, 
		ЭлементИсточник.ТипЭлемента, ФормаПриемник.Элементы[ЭлементИсточник.Родитель.Имя]);
	
	ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник);

КонецЦикла;

Но такой подход оказался нежизнеспособным. Для того чтобы скопировать элементы одной формы на другую, нужно иметь к ним обеим одновременный доступ. А из-за того, что метод ПолучитьФорму() доступен только на клиенте, управлять копированием можно только с клиента. Но на клиенте недоступно свойство ПутьКДанным элементов формы, не доступен метод ПолучитьРеквизиты(). Они доступны только в серверном контексте. А к нему есть доступ только у самой формы.

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

 
Кстати, интересное наблюдение  

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

&НаСервере
Функция с_ПолучитьОписаниеФормы() Экспорт
	
	Возврат с_КопированиеФорм.с_ПолучитьОписаниеФормы(ЭтаФорма, РеквизитФормыВЗначение("Объект"));
	
КонецФункции

Объект мы передаем для того чтобы можно было отличить добавленные на форму колонки табличных частей от тех которые были в объекте изначально.

В форме-приемнике нужно будет прописать процедуру заполнения по переданному описанию:

&НаСервере
Процедура с_ЗаполнитьФормуПоОписанию(АдресВоВременномХранилище) Экспорт
	
	с_КопированиеФорм.с_ЗаполнитьФормуПоОписанию(ЭтаФорма, АдресВоВременномХранилище);
	
КонецПроцедуры

В обработке для копирования остается только выполнить код:

ФормаИсточник = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");
ФормаПриемник = ПолучитьФорму("ВнешняяОбработка.с_ЗаполнениеИзВнешнейФормы.Форма");

АдресВоВременномХранилище = ФормаИсточник.с_ПолучитьОписаниеФормы();
ФормаПриемник.с_ЗаполнитьФормуПоОписанию(АдресВоВременномХранилище);

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

КопироватьДанныеФормы(ФормаИсточник.Объект, ФормаПриемник.Obj);

Obj - это объект, который будет хранить копию объекта источника в форме приемника. Использовать объект приемника не получится, т.к. он будет с другим типом (вероятно, ВнешняяОбработкаОбъект).

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

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

С добавлением элементов в структуру тоже есть некоторые нюансы, которые следует учесть:

Во-первых, элементы формы не помещаются во временное хранилище, поэтому их тоже придется сериализовать самостоятельно.

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

В-третьих, в зависимости от типов и видов элементов меняется набор имеющихся свойств. 

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

Процедура с_ДобавитьЗначениеСвойства(ОписаниеЭлемента, Элемент, ИмяСвойства)
	
	Значение = Элемент[ИмяСвойства];
	ОписаниеЭлемента.Вставить(ИмяСвойства, Значение);
	
КонецПроцедуры

И вызывается она как то так:

с_ДобавитьЗначениеСвойства(ОписаниеЭлемента, Элемент, "Видимость");

В зависимости от типа элемента меняется его набор свойств.

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

Для получения коллекций (подчиненных элементов или командной панели) создана отдельная процедура, добавляющая элементы в цикле.

Функция с_ПолучитьОписаниеЭлементов(КоллекцияЭлементовФормы)
	
	ОписаниеКоллекции = Новый Массив;

	Для Каждого Элемент Из КоллекцияЭлементовФормы Цикл
		
		ОписаниеЭлемента = с_ПолучитьОписаниеЭлемента(Элемент);
		ОписаниеКоллекции.Добавить(ОписаниеЭлемента);
		
	КонецЦикла;
	
	Возврат ОписаниеКоллекции;
	
КонецФункции

Заполнение описания в зависимости от типов элементов можно посмотреть в коде в конце статьи. Интеллектуальной нагрузки оно не содержит, только долгую кропотливую работу.

Аналогичные действия производятся и в обратном порядке.

Заполнение свойств выделено в отдельную процедуру с той же целью - уменьшить количество текста.

&НаСервере
Процедура с_ЗаполнитьЗначениеСвойства(Элемент, ОписаниеЭлемента, ИмяСвойства);
	
	Если Элемент[ИмяСвойства] <> ОписаниеЭлемента[ИмяСвойства] Тогда
		Элемент[ИмяСвойства] = ОписаниеЭлемента[ИмяСвойства];
	КонецЕсли;
	
КонецПроцедуры

И вызывается она так:

с_ЗаполнитьЗначениеСвойства(Элемент, ОписаниеЭлемента, "Видимость");

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

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

КонецПроцедуры

И уже в процедуре заполнения делается ветвление в зависимости от типа элемента:

Процедура с_ЗаполнитьСвойстваЭлементаФормы(Форма, Элемент, ОписаниеЭлемента)
	
	Если ОписаниеЭлемента.ТипЭлемента = Тип("ГруппаФормы") Тогда
		с_ЗаполнитьСвойстваГруппыФормы(Форма, Элемент, ОписаниеЭлемента);
		
	ИначеЕсли ОписаниеЭлемента.ТипЭлемента = Тип("ТаблицаФормы") Тогда
		с_ЗаполнитьСвойстваТаблицыФормы(Форма, Элемент, ОписаниеЭлемента);
		
	ИначеЕсли ОписаниеЭлемента.ТипЭлемента = Тип("ПолеФормы") Тогда
		с_ЗаполнитьСвойстваПоляФормы(Элемент, ОписаниеЭлемента);
		
	ИначеЕсли ОписаниеЭлемента.ТипЭлемента = Тип("КнопкаФормы") Тогда
		с_ЗаполнитьСвойстваКнопкиФормы(Элемент, ОписаниеЭлемента);
		
	КонецЕсли;
	
КонецПроцедуры

Как и при заполнении описания, заполнение свойств элементов в зависимости от типа интереса не представляет и можно найти в полной версии кода (тремя абзацами ниже).

Для демонстрации кода я сделал две простые обработки. Их краткое описание:

Заполнение из внешней формы. Подключаемая к подсистеме дополнительных отчетов и обработок БСП обработка заполнения. В документах, указанных в списке назначений появляется кнопка "Заполнение->Заполнение из внешней формы (С)". При нажатии на кнопку открывается копия формы со всеми данными, но отключенными событиями. При нажатии на кнопку "Перенести в документ" введенные данные копируются в первоначальную форму. ВАЖНО!!! Для работы обработки в форме документа должна быть процедура с_ПолучитьОписаниеФормы(), которую можно найти в модуле объекта обработки.

Копирование форм. Демонстрирует работу описанного в статье подхода. Имеет форму источник и форму приемник. Весь код находится в них, изменять конфигурацию не нужно.

 
 Общий модуль с_КопированиеФорм

 

Конфигурация значения не имеет.

Обе обработки тестировались на платформе 8.3.15.1565

Внешняя обработка заполнения тестировалась на БСП версии 3.0.3.77

Обработка копирования форм от БСП не зависит.

Скачать файлы

Наименование Файл Версия Размер
Заполнение из внешней формы:

.epf 10,32Kb
5
.epf 1.0.0 10,32Kb 5 Скачать
Копирование форм:

.epf 23,67Kb
8
.epf 1.0.0 23,67Kb 8 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 03.10.19 13:30 Сейчас в теме
КопироватьДанныеФормы(ВладелецФормы.Объект, ИсточникФормы);
2. nekit_rdx 189 03.10.19 14:17 Сейчас в теме
(1)
КопироватьДанныеФормы

Во-первых, источник в этом методе идет в первом параметре. Во-вторых, что вы пытаетесь им сделать? В статье я использую КопироватьДанныеФормы(), но сделано это для переноса данных формы, а не элементов.
3. VmvLer 03.10.19 14:41 Сейчас в теме
(2) я не читал статью, думал вы вопрос задал - поэтому копирнул вызов из своего кода.
сейчас пробежал по тексту и слегка в замешательстве от количества костылей.

мне хватало метода КопироватьДанныеФормы() для подобных задач
и что-там в параметрах я использую зависит от моей задачи.

минимизировать безразмерные костыли может помогут идеи
тут https://forum.infostart.ru/forum9/topic102786/
4. nekit_rdx 189 03.10.19 15:00 Сейчас в теме
(3) Странно отвечать не читая статью, но да ладно, время ресурс ограниченный, можно понять.

По ссылке довольно интересное решение, спасибо. Правда там задача немного другая, сохранить и передать параметры не зная их список. У меня же задача сохранить и передать все элементы формы. Предполагаю что с параметрами как раз таки проблем не возникнет просто преобразовать их через ДанныеФормыВЗначение(), что в общем то может сработать.

Использовать же СериализаторXDTO для записи формы в XML врядли сработает по той же причине, по которой она не помещается во-временное хранилище - платформа не позволяет сериализовать форму и считает что она должна быть доступна только на клиенте.
5. VmvLer 03.10.19 15:14 Сейчас в теме
Полагаю, что идея по ссылке применима ко всей форме, поэтому я и закинул ее вам, вдруг вы решите отпимизировать свой продукт и вместо массы странного кода получиться метод на один лист.

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

старайтесь!
6. nekit_rdx 189 03.10.19 16:13 Сейчас в теме
(5) Сериализация работает для параметров, но не работает для управляемой формы, я проверил.

Текст ошибки


Есть еще идеи как избавиться от костылей? Кстати, а что вы называете костылями?
7. SlavaKron 03.10.19 18:38 Сейчас в теме
Форма документа доступна на сервере вне своего модуля, для подключенной обработки с видом ЗаполнениеФормы (примерно так), если имеем дело с БСП.
nekit_rdx; +1 Ответить
8. Yashazz 4477 04.10.19 12:10 Сейчас в теме
Можно предположить, что форму все-таки можно получить из метаданных на сервере и там же обработать

Нельзя. И никогда не было и не будет можно, пока разработкой платформы рулит С.Нуралиев. По его словам, все эти штуки в метаданных - настолько для внутреннего служебного, что нам не светит.
11. nekit_rdx 189 04.10.19 13:41 Сейчас в теме
(8) Забавно что в других языках ограничения создаются в целях безопасности, исключения утечек памяти и подобного, а в 1С из-за несоответствия с концепцией.
9. Yashazz 4477 04.10.19 12:14 Сейчас в теме
1. Переменные, объявленные в модуле формы, копируются?
2. Что происходит с данными во временных хранилищах, загнанных туда по GUID исходной формы?
3. Учитываются ли обработчики ожидания исходной формы?
10. nekit_rdx 189 04.10.19 13:36 Сейчас в теме
(9)

1. Копировать переменные, объявленные в модуле формы равносильно копированию кода этого модуля. По крайней мере я не знаю другого способа получить к ним доступ. Теоретически да, можно выгрузить модуль в файл и распарсить его. Технически - не проще ли использовать реквизиты формы?

2. Данные формы во временное хранилище передаются через структуру. При помещении в структуру происходит копирование значения. Причем это обычное поведение, исключение я видел разве что с объектами XDTO, да со строками таблиц. В этом случае может быть несколько переменных, управляющих одним объектом. В структуре во временном хранилище же по факту доступа к данным исходной формы нет, она даже может безболезненно перестать существовать. Хотя может быть вы спрашивали что-то другое?

3. Ни обработчики событий, ни обработчики ожидания в новую форму не переносятся.
12. Yashazz 4477 04.10.19 14:13 Сейчас в теме
(10)
1. Насчёт того, что проще использовать - вопрос к писателям типовых конфигураций) Там есть любители во множестве юзать переменные формы.
2. Я про другое: ПоместитьВоВременноеХранилище(НекиеДанные,ЭтотОбъект.УникальныйИдентификатор) - среди таких бывает важное и даже ключевое.
3. ОК
14. nekit_rdx 189 04.10.19 15:32 Сейчас в теме
(12)
1. Что верно то верно) Я пожалуй позже добавлю получение переменных, хотя само по себе оно может потянуть на статью, и я не уверен что у меня выйдет. Время покажет)
2. Если верить справке - НекиеДанные исчезнут после закрытия формы. Если хочется сохранить их подольше то лучше использовать
ПоместитьВоВременноеХранилище(НекиеДанные, Новый УникальныйИдентификатор)

тогда НекиеДанные будут храниться до завершения сеанса.
Кстати спасибо, не знал об этих особенностях. Похоже от ошибок меня спасло только то что данные из временного хранилища я использую сразу.
17. Yashazz 4477 04.10.19 16:38 Сейчас в теме
(14) Верно, но опять же, многое привязывают к гуиду формы именно чтоб не висело почём зря, на это логику вешают - скопируете вы форму, а времянок-то и нету, хз как код начнёт себя вести.
13. zarankony 288 04.10.19 15:05 Сейчас в теме
Вы же в курсе что Вы можете получить форму, сделать на ней любые изменения без обработчиков изменения, а уже потом открывать?
Форма = ПолучитьФорму(ИмяФормы,Параметры);
Форма.Объект.Сумма = 0;
Форма.Элементы.Кнопка.Доступность = Ложь;
Форма.Открыть();

Если я правильно понял суть проблемы, то это решение проще и изящнее будет.
15. nekit_rdx 189 04.10.19 15:48 Сейчас в теме
(13) Я похоже ввел в заблуждение постановкой задачи.

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

Сама же статья немножко не об этом. Она о том как взять пустую форму без элементов и заполнить ее элементами другой формы.
16. Yashazz 4477 04.10.19 16:37 Сейчас в теме
(15) Ну насчёт действий можно же проще. Взять да при создании формы, либо получив её и ещё не открывая, порезать все действия. Например
НужнаяФорма.Элементы.НужноеПоле.УстановитьДействие("ПриИзменении","")
и "адью" всем событийщикам, никто не рыпнется.
18. nekit_rdx 189 05.10.19 09:56 Сейчас в теме
(16) Удалить действие это частный случай, в нем конечно проще сделать так как предлагаете вы. А установить МоеДействие не прописав процедуру в форму уже не получится.
19. Cyberhawk 131 30.10.19 13:46 Сейчас в теме
(18) Но ведь можно прописать в целевую форму один универсальный обработчтик (по аналогии с "Подключаемый_..." из БСП) и дело в шляпе? Будет одна точка входа, из нее уже вызывать свои общие модули.
20. nekit_rdx 189 31.10.19 10:14 Сейчас в теме
(19) Точно, именно так и сделано в обработке Заполнение из внешней формы. И именно поэтому весь код в конце (под спойлером) записан одним длинным текстом. Этот текст можно скопировать в общий модуль и вызывать из нужной формы. Неудобство только в том что этот вызов нужно прописывать в каждую форму.

Кстати, использовать "Подключаемый_..." это интересная идея, которой я загорелся после комментария @SlavaKron (7). Правда я пока не разобрался как ее использовать. Может быть можно генерировать адрес временного хранилища, передавать его в подключаемую команду, которая описание формы поместит по этому адресу. В таком случае можно будет даже не менять форму, что очень обрадует тех кто не хочет снимать конфу с поддержки. Если у меня получится я дополню статью)
21. SlavaKron 31.10.19 12:02 Сейчас в теме
(20) Я такое делал. Вот обработка, которая внедряется в открытую форму на сервере. Она, правда, сыровата - всё руки не дойдут доделать.
Прикрепленные файлы:
ИсследованиеФормы.epf
purgin; nekit_rdx; +2 Ответить
22. nekit_rdx 189 31.10.19 16:14 Сейчас в теме
23. Cyberhawk 131 31.10.19 17:31 Сейчас в теме
(20)
Неудобство только в том что этот вызов нужно прописывать в каждую форму
Ну так и точка входа для получения структуры данных формы тоже надо прописать в каждую.
25. RocKeR_13 1201 28.06.21 17:34 Сейчас в теме
(15)
Если действий много, то все они должны быть прописаны в форме, а это приводит к копированию потрянок текста в каждую из форм.

Если конфа на БСП, то обычно использую обработчик

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры


Дальше уже по имени команды разбираемся, что делать

UPD. Ниже не прочел, что метод уже предложили)
24. buzzzard 51 03.12.20 10:06 Сейчас в теме
Никита, большое человеческое тебе спасибо за исходники!
26. Mobile888 19.03.23 14:16 Сейчас в теме
Здравствуйте. Есть возможность скопировать состав набора (список комплектующих в динамическом наборе (набора с характеристиками))? УТ 11.5
Оставьте свое сообщение

См. также

Как передать Таблицу Значений в Динамический Список?

Механизмы платформы 1С Универсальные функции Платформа 1С v8.3 Абонемент ($m)

До версии 8.3.9 ответ однозначен - никак. Потом были добавлены временные таблицы для динамических списков, но официальный ответ остался неизменным - никак. Ну а если очень надо?

1 стартмани

17.10.2022    3083    Dementor    9    

20

Если хочется функционального программирования с функциями высшего порядка и map, filter, reduce

Математика и алгоритмы Универсальные функции Платформа 1С v8.3 Абонемент ($m)

Как известно, 1С не поддерживает парадигму функционального программирования (если не учитывать обработчики оповещений). Но часть элементов этого самого функционального программирования можно эмулировать. В статье рассмотрен способ такой эмуляции и приложена конфигурация с реализацией.

1 стартмани

07.07.2022    2251    Alxby    42    

15

Работа с абстрактным массивом

Математика и алгоритмы Универсальные функции Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

07.07.2021    6315    kalyaka    57    

31

Модель запроса

Универсальные функции Платформа 1С v8.3 Запросы Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

01.03.2021    4830    kalyaka    26    

47

Строковые отборы в 1С

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

14.12.2020    9087    lastcontra    4    

0

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

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

3 500 рублей

Сохранение настроек колонок

Работа с интерфейсом Универсальные функции Платформа 1С v8.3 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    2597    Arc    1    

4

Склонение словочетаний

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Рассмотрены возможные инструменты для склонения словосочетаний разных форм: ФИО, произвольные слова, слова с числительными и разными форматами чисел.

1 стартмани

22.06.2020    3435    PeskovOleg    1    

3

Универсальные функции: разложение произвольной строки адреса в структуру

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    7736    vik070777    12    

18

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

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

24.08.2019    23807    BenGunn    29    

130

10 способов получить модуль числа (а может, и больше)

Математика и алгоритмы Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    25023    sam441    36    

54

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

Работа с графической схемой в объектной модели DOM

Универсальные функции Платформа 1С v8.3 Управляемые формы Абонемент ($m)

Пример кода для работы с графической схемой в объектной модели DOM, платформа 8.3.12.

1 стартмани

04.06.2019    8822    botokash    19    

51

Картинки во внешней печатной форме (Шапка и табличная часть)

Универсальные функции Оперативный учет Управляемые формы 1С:Управление торговлей 11 Россия Абонемент ($m)

Способы вывести на печать картинку в шапке и в табличной части внешней печатной формы. Управление торговлей, редакция 11 (11.4.7.150).

1 стартмани

27.05.2019    27355    Povinger    12    

26

Корректировка движений документа

Универсальные функции Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Корректировка движений документа после его проведения по типовому алгоритму.

1 стартмани

26.05.2019    10971    rutadmeen    1    

5

Создание внешней печатной формы в формате документа Word

Адаптация типовых решений Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В статье написано, как создать внешнюю печатную форму (для конфигураций с БСП) в формате Word.

1 стартмани

17.05.2019    37948    ВикторП    28    

67

Программное формирование картинки в 1С:Предприятие 8.3.9 (ПотокВПамяти / ЗаписьДанных)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В статье представлен код программного формирования картинки (двоичные данные) без всяких внешних компонент, без формирования строки Base64, используя лишь встроенные механизмы 1С предприятие 8.3.9 (объекты ПотокВПамяти и ЗаписьДанных). Сам по себе код формирования картинки не несёт ничего нового. Всё описано в википедии. Захотелось попробовать новые методы, но никак не доходитили руки. В приложении обработка практически с этим же кодом.

1 стартмани

16.05.2019    13527    yku    11    

67

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

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

Функциональное программирование в 1С

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

28.03.2019    11224    alexey.kutya    26    

7

Доработка функции ОбщегоНазначения.ЗаменитьСсылки для автоматической чистки или свёртки табличных частей

Универсальные функции Платформа 1С v8.3 Абонемент ($m)

Стандартная обработка по замене дублей ругается на документ с неуникальными строками. Предполагается, что их нужно либо а) удалить, либо б) свернуть. Я немного модифицировал код функции ОбщегоНазначения.ЗаменитьСсылки, встроив в него вызов процедуры, переопределяемой в модуле менеджера соответствующего документа. И в этом модуле менеджера мы уже сами определяем - удалить или свернуть. Ну и вообще там чего хошь можно с этой коллекцией сделать - сам же ж процедуру пишешь...

1 стартмани

12.09.2018    4700    albert.goncharov    0    

5

Пропорциональное распределение в запросе

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

28.06.2018    13429    invertex    8    

38

Заполнение справочника с изображениями элементами по умолчанию

Универсальные функции Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Абонемент ($m)

Пример одного из решений, как можно заполнить справочник с изображениями значениями по умолчанию включая сами изображения. Сами изображения взяты из программы MapSource 6.16.3. Данные для загрузки хранятся в макете в формате XML.

1 стартмани

26.03.2018    9223    Kim1C    0    

2

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Работа с кодами - числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Поддерживается преобразование Кодов на основе Алфавитов, в том числе ''блочных" кодов - состоящих из блоков (подстрок) одинаковой длины (например: 8, 16, 32-битные коды, Хэши и т.п.). Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.

1 стартмани

28.11.2017    8153    newold2    1    

2

Выбор файла и загрузка его на сервер в асинхронном режиме

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Несколько библиотечных процедур, упрощающих жизнь разработчика при отключенном режиме модальности.

1 стартмани

22.10.2017    45690    json    5    

51

Размеры управляемой формы

Работа с интерфейсом Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

08.10.2017    33368    json    10    

112

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

Универсальные функции HighLoad оптимизация Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    53729    DarkAn    87    

195

Читаем *.bmp напрямую в ТабДок двоичными данными

Файловый обмен (TXT, XML, DBF), FTP Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

После полученного интереса к публикации http://infostart.ru/public/601635/ о одном из способов формирования изображений в 1С я решил продолжить изучать другие возможности "рисования" в 1С. Естественно, самым простым форматом после svg будет старый добрый растр в bmp. Но когда приступил к написанию - понял, что формировать картинку с "0", наверное, будет нечестно по отношению к читателю, и для начала нужно разобрать, что такое bmp как формат, как его читать и, главное, показать примеры работы с новыми механизмами платформы.

1 стартмани

12.04.2017    11627    kot-stas    11    

38

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Функция преобразования промежутка времени в строку

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Функция предназначена для преобразования промежутка времени в строку с разбивкой по годам, дням, часам, минутам, секундам.

1 стартмани

23.09.2016    10470    vovant    1    

7

7 правил RFC 4180

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Что такое CSV? Описание правил формата RFC4180 и пара функций чтения/записи CSV текста в ТЗ согласно этим рекомендациям (с экранированием и _поддержкой многострочных полей_).

1 стартмани

22.08.2016    29316    kuzyara    12    

54

Форматированная строка

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

13.09.2013    22857    holostyak    31    

5

Функция Преобразование строки без пробелов (СтрокаБезПробелов)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Функция ПреобразованиеСтрокиБезПробелов в Строку с пробелами с разделением по Заглавным буквам. ОКОНЧАТЕЛЬНАЯ ВЕРСИЯ! Теперь с воможностью добавления исключений, которые не надо преобразовывать в нижний регистр (НДС, ГТД...). Вы можете добавить свои исключения в массив исключений. В строке без пробелов может быть неорганиченное количество РАЗНЫХ Исключений (если, нпример, НДС повторяется в строке 2 раза функция преобразует вторую НДС в нижний регистр).

1 стартмани

31.07.2013    12548    vovant    5    

11

Реализация паузы выполнения кода, используя Wscript

Универсальные функции Платформа 1С v8.3 Россия Абонемент ($m)

Мне понадобилось реализовать паузу в одном алгоритме, и пауза должна была быть не более полусекунды. Поиски в интернете особо не удались, т.к. варианты либо кривы, либо не совсем оптимальны.

1 стартмани

19.06.2013    19985    Alximikkk    16    

20

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

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

Конвертер Даты из числового формата Excel

Загрузка и выгрузка в Excel Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Столкнувшись с проблемой загрузки в 1С из Excel Даты-Времени в числовом формате к удивлению не нашел нигде подобных формул. Может потому что они уж слишком банальны, а может потому что они "тайное знание посвященных". В общем, эта обработка пример конвертации Excel <=> 1C

1 стартмани

17.04.2013    22052    vova196    5    

19

Точка Актуальности для 1С 8

Универсальные функции Платформа 1С v8.3 1С:Управление торговлей 10 Абонемент ($m)

Все знают, что такое ТА для 1с 7.7 И этот механизм отсутствует в 1С 8. Но многие бухгалтера привыкли к нему. Почему бы тогда его не реализовать?

1 стартмани

18.12.2012    21913    Sykoku    28    

4

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

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Полезная функция для получения значения произвольной пользовательской, не предопределенной, характеристики из ПланВидаХарактеристик.НастройкиПользователей

1 стартмани

03.08.2012    8931    Sergeevich    7    

4

Как быстро вынести типовую печатную форму из конфигурации во внешнюю печатную форму

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Как быстро и с минимальными изменениями встроенную печатную форму (например, ТОРГ-12) вынести во внешнюю печатную форму и выполнить требуемые доработки?

1 стартмани

16.12.2011    19473    Kutuzov    17    

47

Сохранение реквизитов и табличных частей объектов в XML

Универсальные функции Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Пример того, как можно сохранять и загружать объекты 1С методами встроенных объектов ЗаписьXML и ЧтениеXML.

1 стартмани

25.11.2011    24719    saiten    21    

32

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Синхронизация с сервером 1С во внешнем соединении

Внешние источники данных Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Позволяет установить время удаленного SQL-сервера на компьютере при выполнении обмена через Внешнее соединение

1 стартмани

27.09.2011    14074    sml    6    

12

Пример преобразования дерева значений в таблицу значений и обратно в 1Cv8

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

09.08.2010    105149    Sintson    68    

163