1с 8.3 открыть форму на сервере. УФ: программное создание и копирование документов с использованием конструкций ДанныеФормыВЗначение, ЗначениеВДанныеФормы. Как открыть форму и задать на ней отбор

Вопрос: Получить форму "На Сервере"


Есть следующая проблема нужно передать форму на сервер. Так понимаю нужно получить на клиенте структуру и передавать ее на сервер. Помогите подредактировать следующий код
Код 1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 СоздатьДокумент Уведомление(МассивВыделенныхСтрок) ; КонецПроцедуры & НаСервере Процедура СоздатьДокумент Уведомление(ПациентыМассивИдентификаторов, НеУведомлять = Ложь ) Новый Документ = Документы . ст_Уведомление. СоздатьДокумент () ; ФормаДокумента = Новый Документ. ПолучитьФорму( "Не уведомлять никогда" ; Иначе Новый Документ. Текст = "Уведомлен (ы)" ; КонецЕсли ; Новый Документ. Дата = НачалоДня (ТекущаяДата () ) ; Для Каждого ИдентификаторСтроки Из

Ответ: Сделал так и заработало:

Код 1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 & НаКлиенте Процедура Уведомить(Команда) МассивВыделенныхСтрок = Элементы. Уведомления. ВыделенныеСтроки; СоздатьДокумент Уведомление(МассивВыделенныхСтрок) ; КонецПроцедуры & НаКлиенте Процедура СоздатьДокумент Уведомление(ПациентыМассивИдентификаторов, НеУведомлять = Ложь ) ФормаДокумента = ПолучитьФорму("Документ.ст_Уведомление.ФормаОбъекта" ) ; Новый Документ = ФормаДокумента. Объект; Новый Документ. НеУведомлять = НеУведомлять; Если НеУведомлять Тогда Новый Документ. Текст = "Ніколи не здійснювати нагадування" ; Иначе Новый Документ. Текст = "Повідомлений (а)" ; КонецЕсли ; Новый Документ. Дата = НачалоДня (ТекущаяДата () ) ; Для Каждого ИдентификаторСтроки Из ПациентыМассивИдентификаторов Цикл НоваяСтрока = Новый Документ. Пациенты. Добавить() ; НоваяСтрока . Пациент = Уведомления. Найти ПоИдентификатору(ИдентификаторСтроки) . Пациент; КонецЦикла ; ФормаДокумента. Открыть() ; КонецПроцедуры

Вопрос: v7: Открыть форму("не работает!")!


пишу, ОткрытьФорму("Документ.Бронь_Подрезки",Контекст);
но не открывает этот документ, если кто знает, помогите пожалуйста!
пробовал разные варианты и этот документ существует.

Ответ: () Так-так.. значит в 0 ты соврал? Ввёл сообщество в заблуждение? Отвлёк от важных дел? Заставил кого-то поставить давно забытую 1С 7.7, а кого-то даже поднять SQL-сервер для проверки работы в разных вариантах работы базы? И всё это только потому что ты не смог корректно нажать Ctrl+C / Ctrl+V?!

Вопрос: Внешняя печатная форма "Платежное поручение" для документа "Поступление на расчетный счет"(БП 3.0)


Добрый день, Люди добрые!!!
Помогите чайнику!
В 1С 8.3 Бухгалтерии понадобилось распечатывать платежные поручения для документов "Поступление на расчетный счёт" через внешнюю печатную форму, так как в самой 1с она отсутствует

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

{ВнешняяОбработка.ПоступлениеНаСчет.МодульОбъекта(74,28)}: Переменная не определена (УправлениеНебольшойФирмойСервер)

Как это можно исправить?

Ответ:

artsh сказал(а):

Добрый день, Люди добрые!!!
В наличии есть форма только для 8.2, при подключении в 8.3 выдает:
Как это можно исправить?

Нажмите, чтобы раскрыть...

Дело не в том, 8.2 или 8.3! Важна информация о конфигурации.
Вы пытаетесь открыть в БП (2.0 или 3.0 ???) обработку, предназначенную для УНФ!
Естественно в БП нет такой процедуры как "УправлениеНебольшойФирмойСервер".

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

Вопрос: Регламентное задание "Загрузить файлы на сервере"


Добрый день!
Может, кто сталкивался с подобной задачкой и подскажет, как ее решить (ну или пошлет... в нужном направлении)?
Исходные данные:
1. Имеются торговые точки которые формируют файлы трех типов: CSV, XLS, DB.
2. Файлы поступают на три ПК (разные каналы получения файлов и разные системы декодирования).
3. Имеется обработка, которая из полученных файлов получает необходимые данные и загружает их в файловую ИБ.
4. Обработка запускается через штатный планировщик по расписанию.
Задача:
1. Перенести весь этот процесс на серверную платформу.
2. Организовать загрузку файлов через регламентное задание.
Проблема(ы):
1. Регламентные задания выполняются серверными процедурами, а загрузка и обработка файлов это в основном клиентские процедуры.
2. ...?
Вопрос:
Как из регламентного задания просканировать каталог на другом ПК и загрузить найденные файлы?

Ответ:

Вам уже написали ответ.

Вопрос: Серверная "База не найдена"


Сегодня случилось что-то странное. Одна из баз перестала открываться. Выдается ошибка, что "база не найдена". На сервере 1С она есть, в sql - тоже. А не открывается.
Я на sql-сервере сделала ее копию, потом подключила в 1с-сервере - и все заработало нормально. Но что случилось-то со "старой" базой?? Как можно уточнить откуда ноги растут у такой ошибки?

Ответ:

Draco сказал(а):

Ну провериь какой сервер и порты были прописаны как пкть к базе и на том же кластере посмотреть естть там или нет и те же порты у клатера или нет

Нажмите, чтобы раскрыть...

пойду попрошу гугла расшифровать

Вопрос: УПП 1.3 В Расчете при увольнении "Заработок" меньше чем в Расчетном листке. HELP


УПП 1.3 В документе "Расчет при увольнении" в печатной форме Т-61 в графе "Заработок" сумма меньше чем "Начислено" в печатной форме "Расчетного листка" в документе "Начисление зарплаты сотрудникам Организации".

Еще. Суммы по документам "Оплата праздничных и выходных" в Расчетный листок попадают, в Т-61 при увольнении - нет.

Подскажите набор правильных шаманских действий, чтоб встало на место.

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


Ответ:

Сообщение от rung15

Кому я это писала?

Сообщение от GreenkA

Кнопка списка и дает эти "три точки", которые у вас пропали. Автоматом у вас это отображаться не будет, потому что тип реквизита "id_Экземпляр" - Строка. Был бы справочник - ничего в свойствах изменять не пришлось бы, и пометки "Авто" хватило бы.

Сообщение от rung15

Начинать сначала можно много раз, но итог будет один и тот же, если не понять, в чем проблема. Может стоит что-то перечитать? Эту тему, книгу, погуглить...

Ответы на вопросы из файла

Почитайте
Справочник.Книги.Экземпляры <ИмяТаблицы>.<ИмяПоля>, отсюда




.

Если НайдСтрока.Количество() >

Директивы компиляции

&НаКлиенте (&AtClient)
&НаСервере (&AtServer)

Модуль формы

Модуль команды

Общий модуль
&НаКлиенте, &НаСервере.

Вопрос: Создание дипломного проекта "Электронная библиотека"


Здравствуйте. Пишу диполом на 1с. Электронная Библиотека. Итак суть проблемы: Я хотел бы чтобы в табличной части справочника "Студенты"-1, после выбора в реквизите "Название_Книги"-2 определённой книги, в реквизите "id_Экземпляр"-3 появлялся на выбор список доступных экземпляров. Цифрами возле ковычек я отметил обозначения на картинки. Ещё бы конечно было неплохо чтобы при попадании экземпляра к студенту чтобы статус менялся, но это зада второстепенная. Помогите пожалуйста. Ещё вопрос: Почему после ссылания на какое-то поле я могу в текущее поле добавлять только стандартный реквезит "Наименование"? Спасибо за уделённое внимание. (Ещё посоветуйте пожалуйста книжек для чайника которые могли бы помочь в моей теме плиз.)

Ответ:

Сообщение от rung15

не знаю почему, но список выпадает только при нажатии кнопки ф4, а когда нажимаешь на стрелочку ничего не происходит, и троеточие пропало куда-то

Кому я это писала?

Сообщение от GreenkA

Не забудьте в свойствах элемента формы "id_Экземпляр" включить "Кнопку списка".

Кнопка списка и дает эти "три точки", которые у вас пропали. Автоматом у вас это отображаться не будет, потому что тип реквизита "id_Экземпляр" - Строка. Был бы справочник - ничего в свойствах изменять не пришлось бы, и пометки "Авто" хватило бы.

Сообщение от rung15

Вот чего я достиг за 6 часов и более 8 пересозданных конфигураций

Начинать сначала можно много раз, но итог будет один и тот же, если не понять, в чем проблема. Может стоит что-то перечитать? Эту тему, книгу, погуглить...

Ответы на вопросы из файла


СтандартнаяОбработка = Ложь; - (Для чего это, как я понял если книга не заполнена чтобы не выполнялась обработка выводящая список экземпляров.)
Отключение стандартной обработки события элемента формы, чтобы сработало наше описание события.
Пример для вашей конфигурации: есть элемент формы, связанный с реквизитом Название_Книги (тип СправочникСсылка.Книги). Стандартная обработка события НачалоВыбора() этого элемента приведет к открытию ФормыВыбора справочника Книги. Если мы хотим передать туда дополнительные параметры, выставить например отбор, открыть другую форму - отключаем стандартную обработку и пишем то, что хотим сделать по этому событию.

&НаСервереБезКонтекста (Чем отличаеться сервер с контекстом и без, и почему именно такой выбран)
Почитайте про директивы в 1С. Много, но полезно.

Почитайте
Конкретно по вашим вопросам: это текст запроса, в котором идет обращение к таблице Справочник.Книги.Экземпляры (табличной части Экземпляры), имя таблицы в запросе можно менять, здесь оно определено как КнигиЭкземпляры. Поэтому все получаемые поля мы определяем как <ИмяТаблицы>.<ИмяПоля>, отсюда
КнигиЭкземпляры.id_Экземпляр. "КнигиЭкземпляры.Ссылка = &Ссылка" - отбор записей в запросе по конкретному элементу справочнику Книги, который мы позже выставляем как параметр - "Запрос.УстановитьПараметр("Ссылка", Книга);".

Книги_Студентаid_ЭкземплярПриИзмененииНаСервере(ТекущаяСтрока.Название_Книги, ТекущаяСтрока.id_Экземпляр); (Это типа пересылка на процедуру ниже)
Это вопрос или утверждение? Типа да)

НайдСтрока = ТекущаяКнига.Экземпляры.НайтиСтроки(Новый Структура("id_Экземпляр", id_Экземпляр)); (Тут вообще не понимаю ничего, и для чего нам нужна структура особенно)
Умеете пользоваться синтакс-помощником? Вызов ctrl+f1, если выставите в это время курсор на чем-то непонятном - он еще сразу и попытается найти информацию об этом, с описанием и примерами.
Описание метода НайтиСтроки(): осуществляет поиск строк табличной части, соответствующих заданному условию поиска.
Условия поиска заданы в скобках в виде структуры, где в начале "id_Экземпляр" - ключ структуры, имя колонки поиска, дальше - значение структуры - id_Экземпляр(без кавычек). Это значение мы передали при вызове процедуры Книги_Студентаid_ЭкземплярПриИзмененииНаСервере(Книга, id_Экземпляр) .

Если НайдСтрока.Количество() > 0 Тогда () (Если мы выбираем какую-то строку из экземпляров то делаем её ложной?)
Ложной - это как? В этой строке мы проверяем, нашлись ли строки в табличной части по заданным параметрам поиска, чтобы не было ошибок при попытке получения значения по индексу.

Директивы компиляции


Каждая процедура и функция модуля формы, модуля команды и общего модуля управляемого приложения предваряется директивой компиляции, определяющей среду исполнения данной процедуры. Директива предваряется символом "&". Допустимые директивы:

&НаКлиенте (&AtClient) - определяет клиентскую процедуру (функцию);
&НаСервере (&AtServer) - определяет серверную процедуру (функцию);
&НаСервереБезКонтекста (&AtServerNoContext) - определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных методов. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения;
&НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext) - определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере, не имеющую доступа к контексту формы, данным формы, переменным, но имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно. Сама процедура (функция) доступна для клиентский, серверных контекстных и неконтекстных процедур и функций модуля формы. Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей;
&НаКлиентеНаСервере (&AtClientAtServer) - определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере, имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным. Сама процедура (функция) доступна для клиентских серверных процедур и функций модуля команды.
Клиентская процедура (функция) исполняется в среде клиентского приложения. В такой процедуре доступен клиентский контекст формы и вызовы любых процедур модуля.

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

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

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

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

В модуле команды предопределенная процедура-обработчик ОбработатьКоманду должна предваряться директивой &НаКлиенте, так как выполнение команды происходит в клиентском приложении.

Модуль формы
В модуле формы доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста.
Модуль команды
В модуле команды доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаКлиентеНаСервере.
Общий модуль
В общем модуле доступны директивы компиляции – &НаКлиенте, &НаСервере.

Вопрос: Работа внешней компоненты с сервером 1С...


Добрый день,

Имеется внешняя компонента, написанная на С++, задача которой получение информации из внешней базы данных и возврат результата запроса в виде Таблицы значений в 1С.
Для формирования таблицы значений на текуший момент используется интерфейс IDispatch* pBackConnection, получаемый в качестве параметра в функции Init(). Далее я просто, используя функции 1С формирую таблицу значений, заполняю ее и возвращаю ее во второй параметр в CallAsFunc(...).
Проблемы начались с переходом на тонких клиентов 1С. На стороне сервера внешняя компонента толком не запускается. Можно запустить на стороне клиента, но это все выглядит как костыли и выпадает из общей логики "клиент-сервер" в 1С. Например клиент не понимает, что такое таблица значений, проблемы с "глобальными" переменными, сеансами и т.п.
NativeAPI еще более урезан в этом плане.
Танцы с бубном привели к тому, что я смог запустить внешнюю компоненту под сервером 1С, НО работа происходит до того момента, пока не производится попытка вызвать Invoke у pBackConnection. 64-битная версия сервера 8.2 что-то пытается делать, пока не отваливается по таймауту, 32-битная (ВК естественно тоже 32 битная) просто сразу отваливается.
Предполагаю, что сервер 1С не обслуживает этот режим работы.
Соответственно возникают вопросы, это временно или логика 1С сводится к отмене этой схемы работы? Если создать внутренние структуры 1С (таблицу значений) таким способом нельзя, есть ли в принципе описание, что из себя представляет таблица значений на системном уровне, чтобы попытаться создать ее на С++ , заполнить, а затем просто подсунуть 1С в качестве возвратного параметра? Хотелось бы хотя бы получить направление, в какую сторону копать.

Спасибо.

Ответ:

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

В рамках одного сеанса можно было, и можно сейчас, объявить переменные в модуле сеанса, которые будут жить и будут видны в рамках сеанса из разных мест... вообще-то, их 4-ре штуки.
- Модуль сеанса;
- Модуль обычного приложения;
- Модуль управляемого приложения;
- Модуль внешнего соединения.

Ну и естественно, нужно помнить про контекст. Серверный контекст напрямую не доступен на стороне клиента и наоборот.

Вообще то, архитектурой 1С предусмотрено, что обмен данными будет идти:
- по средствам параметров/возвратов процедур/функций;
- по средствам так называемых параметров сеансов (не могут быть объектами, ну собственно видно в палитре).

Таблица на форме... а она связана с какой-либо таблицей объекта (обработки, например) ? или нет. Если да, то она доступна и на сервере (&НаСервере) там и редактируйте....

И таки да, ТаблицаЗначений не доступна в УФ на стороне клиента. Ну уж так решила 1С.

Да ладно! Вот с Excel работает, с FSO работает и кучей всего остального, а тут тут не работает. Отлавливайте ошибку и анализируйте....

Попытка
...
ваши действия
...
Исключение
стр = ОписаниеОшибки();
КонецПопытки;

При современных аппаратных возможностях, это вообще не аргумент.

Сугубо Ваше лично мнение. Ничего общего с реальностью не имеет. Ни в каком виде. Повторю ещё раз, 1С прекрасно работает с COM. Как с in-proc, так и с out-proc.

Приведите, код, которым вы загружаете и обращаетесь в ВК.

Кстати, ВК... в Вашем случае, это COM или Native API ?
Если COM, то вы регистрируете её как... через regsvr32... как тогда "разруливаете" вопрос разрядности?

Вопрос: COMОбъект("Excel.Application"). На клиенте и на сервере


Приветствую.

Столкнулся с проблемой:
Создал обработку, которая запускает Excel, читает файл, заполняет его и записывает.
На клиенте все великолепно выполняется.
Создал регламентное задание, которое запускает в определенное время это на сервере.
При выполнении на сервере вылезает ошибка про то, что типа MS Excel не удалось получить доступ к файлу. При этом доподлинно известно, что ком. объект Excel даже не создался (нет его в процессах диспетчера задач).
Примечательно, что если запустить обработку клиентом с машины, где установлен сервер 1С, то все выполняется.

Excel = Новый COMОбъект("Excel.Application"); Книга = Excel.WorkBooks.Open("D:\Dst\Order.xls");

Чувствую, что дело тут в том, что при работе с клиента Excel запускается из-под пользователя в реальном сеансе, а в случае сервера - под пользователем хоть и с полными правами, но без запущенного сеанса.

Сервер Windows Server 2008 R2 Standart. Service Pack 1
Как это обойти?

Ответ:

Вдруг кому понадобится
Выполняем команду "mmc comexp.msc /32", которая делает то же что и DCOMCONFIG, но позволяет видеть 32 битные компоненты.

Т.к. часто возникают вопросы по программному созданию/копированию/обработке объектов 1С:Предприятие в режиме "Управляемые формы", то решил скомпоновать в данной публикации примеры решения таких задач, с комментариями по каждому действию. Поначалу кажется все достаточно запутанно, но если по шагам все разложить и немного вникнуть, то всё должно встать на свои места.

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

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

ПРИМЕРЫ:

Ниже я приведу пример как создавать/копировать/изменять документы. Данный пример досконально разобран и позволит понять клиент-серверную архитектуру работы и распространить эти знания на другие объекты 1С (справочники, отчеты...).

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

Для этого я создал соответствующие команды и разместил их на форме.

1. "Создать калькуляцию".

&НаКлиенте Процедура СоздатьКалькуляцию(Команда) // Создаем форму объекта/документа на клиенте мФорма = ПолучитьФорму("Документ.Калькуляция.ФормаОбъекта"); // В переменную передаем объект(данные) открытой формы ДанныеФормы = мФорма.Объект; // выполняем простейшие операции ДанныеФормы.Блюдо = Объект.Ссылка; ДанныеФормы.Дата = ТекущаяДата(); // Открываем заполненную форму объекта (показываем для пользователя) мФорма.Открыть(); КонецПроцедуры

В данном варианте все просто: мы создаем на клиенте процедуру и все действия выполняем прямо на клиенте, т.к. ничего требующего вызова сервера не делаем. Создаем/получаем форму объекта, передаем в переменную ДанныеФормы Объект формы, выполняем элементарные действия с ДанныеФормы и открываем уже заполненную форму.

2. "Скопировать калькуляцию" .

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

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

Порядок действий таков: Мы на клиенте создаем форму нужного нам объекта и сразу открываем её (ОткрытьФорму...). Далее как и ранее мы передаем в переменную ДанныеФормы Объект открытой формы.

Т.к. задача состоит в том чтобы скопировать уже существующий в базе документ (старую калькуляцию, которую выбрал пользователь в динамическом списке), то действия с данными ДБ можно производить только на сервере. Таким образом, мы получаем необходимые параметры из формы номенклатуры (в моем случае старую калькуляцию) и передаем через Структуру эти параметры в серверную процедуру без контекста вместе с переменной ДанныеФормы: СкопироватьОбъектДокументаНаСервере(ДанныеФормы, СтруктураДанных).

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

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

Функция ДанныеФормыВЗначение() требует указания соответствия (типа получаемого объекта): Тип("ДокументОбъект.Калькуляция").

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

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

Думаю, начинающим познавать клиент-серверную архитектуру 1С пригодится данная статья)

Программное открытие форм в управляемом приложении 1С значительно отличается от их открытия в обычном приложении. Рассмотрим для начала старый метод. Он заключается в получении формы и ее последующем открытии в обычном или модальном режиме (при открытии в модальном режиме форма блокирует работу программы).

ПолучитьФорму() . Открыть()

Это самый медленный метод открытия форм. Тем не менее, он позволяет программно обработать форму перед открытием. Для обработки код нужно немного изменить:

Форма= ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента" ) ;
//Тут выполняем действия с формой
Форма. Открыть() ;

Надо учитывать, что при получении формы будет выполняться еще процедура события ПриСозданииНаСервере.

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

1. Как открыть форму объекта в управляемом приложении, если есть ссылка на него.

В этом случае все предельно просто.

СпрСсылка= Справочники. Номенклатура. НайтиПоКоду("000000001" ) ;
ОткрытьЗначение(СпрСсылка) ;

2. Как открыть форму выбора и получить потом выбранное значение.

Для этого существует функция ВвестиЗначение(). У функции 3 параметра:

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

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

Перем Значение;
Массив= новый массив;
Массив. Добавить(Тип("СправочникСсылка.Номенклатура" ) ) ;
Массив. Добавить(Тип("СправочникСсылка.Контрагенты" ) ) ;

ОписаниеТипов= новый ОписаниеТипов(Массив) ;

Рез= ВвестиЗначение(Значение, "Подсказка" , ОписаниеТипов) ;

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

Эта функция имеет довольно много параметров. Рассмотрим некоторые из них:

  • Имя формы — тут можно выбрать либо одну из стандартных форм объекта, например, ФормаВыбора или ФормаСписка . Или конкретную, созданную разработчиками форму.
  • Параметры — позволяет передать в форму в виде структуры некоторые параметры перед ее открытием, тем самым определив выводимые данные. Параметры могут представлять собой любые данные, которые можно передавать с клиента на сервер. Переданные при открытии формы параметры можно обработать в процедуре ПриСозданииНаСервере() у открываемой формы.
  • Режим открытия формы — имеет 3 варианта: независимый, блокировать весь интерфейс, блокировать форму владельца.

Рассмотрим, как применяется функция ОткрытьФорму() в различных ситуациях.

3. Как открыть форму существующего объекта

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

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;
Параметр. Вставить("Ключ" , НайтиС() ) ;
ОткрытьФорму(, Параметр) ;
КонецПроцедуры

&НаСервере
Функция НайтиС() ;
Возврат Справочники. Контрагенты. НайтиПоРеквизиту ("ИНН" , "745107734623" )
КонецФункции

4. Как открыть форму нового объекта

Тут подойдет просто функция ОткрытьФорму() без всяких параметров.

&НаКлиенте
Процедура Команда1 (Команда)
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта" ) ;
КонецПроцедуры

5. Как открыть форму нового объекта и заполнить ее на основании чего-либо

Нужно передать параметр Основание , значением которого будет являться ссылка на объект-основание заполнения. При этом будет запущена процедура ОбработкаЗаполнения().

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;
Параметр. Вставить("Основание" , СсылкаНаСчетПокупателю) ;
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта" , Параметр) ;
КонецПроцедуры

В этом примере будет создан документ Реализация товаров и услуг и заполнен на основании счета на оплату покупателю, ссылка на который была передана.

6. Как открыть форму и задать на ней отбор

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

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

Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура .

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;

Отбор= новый Структура;
Отбор. Вставить("Владелец" , СсылкаНаНоменклатуру) ;

Параметр. Вставить("Отбор" , Отбор) ;

ОткрытьФорму("Справочник.НомераГТД.ФормаСписка" , Параметр) ;
КонецПроцедуры

7. Как открыть форму записи регистра сведений

Для этого понадобится ключ записи регистра сведений.

Ключ записи — это значения всех измерений и период (если регистр периодический). То есть ключ записи — это параметры, по которым можно однозначно идентифицировать запись.

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.

&НаКлиенте
Процедура Команда1 (Команда)
Параметр= новый структура;

ПараметрыКлюча= новый Структура;
ПараметрыКлюча. Вставить("Номенклатура" , СсылкаНаНоменклатуру) ;
ПараметрыКлюча. Вставить("ТипЦены" , СсылкаНаТипЦен) ;
ПараметрыКлюча. Вставить("Период" , Дата) ;

МассивКлюча = Новый Массив;
МассивКлюча. Добавить(ПараметрыКлюча) ;

КлючЗаписи = Новый("РегистрСведенийКлючЗаписи.ЦеныНоменклатуры" , МассивКлюча) ;

Параметр. Вставить("Ключ" , КлючЗаписи) ;

ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи" , Параметр) ;
КонецПроцедуры