При работе в системе 1С:Предприятие 8.3 пользователи часто сталкиваются с необходимостью отображать разные формы или отчеты на отдельных мониторах. Это позволяет значительно повысить удобство и эффективность работы, например, при одновременном анализе нескольких документов или сравнении отчетов. Возникает вопрос: возможно ли открыть два окна одного приложения 1С так, чтобы одно находилось на одном экране, а другое – на втором? Или для достижения такого результата придется запускать приложение 1С дважды?
Рассмотрим эту проблему подробнее, исходя из возможностей платформы 1С:Предприятие и опыта пользователей, особенно в контексте самописных конфигураций на управляемых формах.
Прежде чем углубляться в решения, давайте разберемся с тем, как устроена оконная система в 1С:Предприятие 8.3, особенно в режиме управляемого приложения (интерфейс «Такси»).
Исторически в 1С:Предприятии существовали разные подходы к организации окон. В версии 7.7 и в обычных формах 8.2 преобладала модель MDI (Multiple Document Interface), когда все дочерние окна располагались внутри одного основного окна приложения. Это позволяло держать все рабочие области в рамках одного родительского окна, но ограничивало возможности по их свободному перемещению на разные мониторы.
С появлением управляемых форм и интерфейса «Такси» в 1С:Предприятии 8.3 произошел переход к более строгому, изначально однооконному подходу. Однако, как отмечают пользователи в сообщении (30), в самых первых вариантах управляемых форм была некая возможность, которая впоследствии была изменена, поскольку пользователи 1С привыкли к MDI-поведению. Многие разработчики и пользователи, как видно из сообщений (24) и (27), желали бы иметь возможность свободно выносить формы на разные мониторы, но позиция разработчика 1С долгое время оставалась неизменной: «вам это не нужно и точка». Тем не менее, платформа имеет внутренние механизмы, позволяющие работать с окнами в разных состояниях.
В системе 1С:Предприятие существуют следующие состояния окон, как упоминается в официальной документации (сообщение 15): «Окно, находящееся в свободном состоянии, может располагаться в любом месте экрана. В случае если окно соединяемое, оно может объединяться с другими свободными окнами.» Это указывает на то, что на уровне движка платформы такая функциональность возможна, но ее доступность для конечного пользователя или программная реализация имеют свои особенности.
Клиентское приложение 1С:Предприятия не является многопоточным в том смысле, чтобы параллельно выводить информацию в абсолютно независимые окна, каждое со своим потоком выполнения. Это, как отмечено в сообщении (17), является одной из причин, почему попытки прямого «расщепления» одного сеанса на несколько полностью независимых окон, работающих в синхронном режиме, могут быть сложными.
Рассмотрим доступные способы решения задачи.
Это самый простой и наиболее очевидный способ для достижения цели – иметь два (или более) окна приложения на разных мониторах, как предложено в сообщениях (8) и (16).
Таким образом, если основная задача – просто разместить разные рабочие формы на разных мониторах без сложной синхронизации, запуск нескольких сеансов 1С является оптимальным и самым простым решением.
Интерфейс «Такси» платформы 1С:Предприятие 8.3, начиная с версии 8.3.7.1759, предоставляет функциональность для одновременного отображения нескольких окон, но с важным ограничением: все эти окна остаются внутри основного окна приложения 1С. Эта возможность была реализована специально для экономических задач, требующих одновременного просмотра нескольких объектов, например, сравнения отчетов или документов.
Механизм закрепления позволяет зафиксировать одно из окон в определенной части рабочей области. Другие окна будут открываться рядом, не перекрывая закрепленное.
Эта функция позволяет отображать два открытых окна рядом в рабочей области, что идеально подходит для сравнения.
Главное ограничение, которое не позволяет использовать эти встроенные возможности для решения задачи автора, заключается в том, что закрепленные и объединенные окна всегда остаются внутри одного основного окна приложения 1С. Вы не сможете вынести одно из таких «внутренних» окон на отдельный физический монитор, если основное окно 1С не растянуто на несколько мониторов. Это не обеспечивает желаемую свободу перемещения, о которой идет речь в сообщениях (0) и (6).
Для более гибкой работы с окнами, позволяющей вынести отдельные формы на разные мониторы, платформа 1С:Предприятие в режиме управляемого приложения предлагает возможность открывать формы в отдельных окнах. Это дает большую свободу, чем внутренние механизмы «Такси», и может быть реализовано как программно, так и иногда через пользовательский интерфейс.
В пользовательском режиме для некоторых форм в управляемом приложении доступна команда «Открыть в отдельном окне» или «Новое окно». Ее можно найти в системном меню формы или в контекстном меню на панели открытых окон. Если такая команда доступна, нажатие на нее создаст новую, независимую форму, которая будет вести себя как отдельное окно операционной системы.
Если вам нужно открыть несколько экземпляров одной и той же формы (например, два разных отчета или два разных документа одного типа) и разместить их на разных мониторах, вы можете использовать метод ОткрытьФорму() с параметром «ключ уникальности» и указанием режима открытия окна.
Рассмотрим разберем по шагам, как это сделать:
ОткрытьФорму(): Этот метод позволяет программно открывать формы 1С. Его синтаксис достаточно гибок.Посмотрим на пример кода, который демонстрирует, как это можно реализовать:
// Пример открытия двух экземпляров одной формы отчета в отдельных окнах
// 1. Создадим структуру для настроек открытия окна
// и укажем, что форма должна открыться в отдельном окне.
НастройкиОткрытияОкна = Новый Структура;
НастройкиОткрытияОкна.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаКлиентскогоПриложения.Отдельное);
// 2. Открываем первый экземпляр формы отчета с уникальным ключом "ОтчетПоПродажам_Апрель"
// Второй параметр - это параметры формы, здесь пустые.
// Третий параметр - это владелец формы (здесь не задан).
// Четвертый параметр - это ключ уникальности формы.
// Пятый параметр - это настройки открытия окна.
ФормаОтчетаАпрель = ОткрытьФорму(
"Отчет.ОтчетПоПродажам.Форма.ФормаОтчета",
Новый Структура("Период", НачалоМесяца(ТекущаяДата())), // Пример параметра формы
,
"ОтчетПоПродажам_Апрель",
НастройкиОткрытияОкна
);
// Если необходимо, устанавливаем дополнительные параметры формы
// ФормаОтчетаАпрель.ПараметрыОтбора.Вставить("Месяц", "Апрель");
// ФормаОтчетаАпрель.ОбновитьДанные(); // Или выполнить команду отчета
// 3. Открываем второй экземпляр формы того же отчета
// с другим уникальным ключом "ОтчетПоПродажам_Май"
ФормаОтчетаМай = ОткрытьФорму(
"Отчет.ОтчетПоПродажам.Форма.ФормаОтчета",
Новый Структура("Период", НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), 1))), // Пример параметра формы
,
"ОтчетПоПродажам_Май",
НастройкиОткрытияОкна
);
// ФормаОтчетаМай.ПараметрыОтбора.Вставить("Месяц", "Май");
// ФормаОтчетаМай.ОбновитьДанные(); // Или выполнить команду отчета
// Пример открытия двух разных документов в отдельных окнах
// Предположим, у нас есть ссылки на два разных документа реализации
// СсылкаНаПервыйДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", Дата("20230101"));
// СсылкаНаВторойДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000002", Дата("20230101"));
// Если ссылки существуют, открываем формы документов
// if СсылкаНаПервыйДокумент <> Неопределено Then
// ПараметрыДокумента1 = Новый Структура("Ссылка", СсылкаНаПервыйДокумент);
// ФормаДокумента1 = ОткрытьФорму(
// "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",
// ПараметрыДокумента1,
// ,
// "Реализация_000000001",
// НастройкиОткрытияОкна
// );
// EndIf;
// if СсылкаНаВторойДокумент <> Неопределено Then
// ПараметрыДокумента2 = Новый Структура("Ссылка", СсылкаНаВторойДокумент);
// ФормаДокумента2 = ОткрытьФорму(
// "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",
// ПараметрыДокумента2,
// ,
// "Реализация_000000002",
// НастройкиОткрытияОкна
// );
// EndIf;
После выполнения такого кода в режиме управляемого приложения вы получите два отдельных окна, каждое из которых содержит экземпляр формы отчета (или документа). Эти окна будут отображаться на панели задач Windows как независимые приложения, и их можно свободно перетаскивать на любые подключенные мониторы. Это наиболее точный ответ на изначальный вопрос автора.
Оповестить()) или регламентные задания для фонового обновления.ОткрытьФорму().Итак, на вопрос «можно ли открыть два окна одного приложения 1С?» можно ответить утвердительно, но с оговорками и использованием определенных подходов. Хотя платформа 1С:Предприятие 8.3 в интерфейсе «Такси» изначально стремится к однооконному режиму, существуют эффективные способы организации рабочего пространства на нескольких мониторах:
ОткрытьФорму() с разными ключами уникальности и указанием режима открытия в отдельном окне, мы можем добиться того, чтобы каждая форма отображалась как независимое окно операционной системы, которое можно перетаскивать на разные мониторы. Это решение требует программной доработки, но обеспечивает наибольшую гибкость.Анализируя ситуацию, мы видим, что хотя платформа 1С не предоставляет такого же бесшовного «вытаскивания» форм на отдельные мониторы, как некоторые другие офисные приложения, перечисленные выше методы позволяют решить поставленную задачу. Выбор конкретного подхода зависит от требований к функциональности, необходимости синхронизации данных и готовности к программной доработке.