Передмова: Цей спосіб є лише альтернативою стандартному, який ви можете почерпнути з циклу статей від poppy
Як показала практика, застосування цього способу виправдано лише в дуже рідкісних випадках. Але сам по собі спосіб ітересен в сенсі можливості виконання процедур і функцій, які будуть виконуватися в контексті іншого об'єкта.
Отже. Щоб далеко не ходити, візьмемо типову 1С Бухгалтерію 1.6. І зробимо для неї зовнішню друковану форму друку рахунки-фактури виданого зі своїм макетом і з можливістю зміни модуля формування друкованої форми.
Ми виконаємо таку роботу:
1. Створимо зовнішню друковану форму, що повторює типову.
2. Замінимо у пресі в поле вантажовідправника "він же" на дані організації.
3. Трохи змінимо макет.
Початок нічим не відрізняється від створення обино зовнішньої друкованої форми.
1. Створюємо зовнішню обробку.
2. назавем її "ВнешнійСчетФактураВиданний".
4. У модулі обробки створимо експортну функцію "Друк".
Процедура КнопкаВиполнітьНажатіе (Кнопка)
Друк (). Показати ();
КонецПроцедури
Це дозволить друкувати викликати нашу обробку без підключення зовнішньої друкованої форми, просто відкривши файл.
6. Скопіюємо макет рахунку фактури в нашу обробку. Так як цих макетів повно, скопіюємо все. На всякий випадок.
Поки все як завжди. Результат - див малюнок 1.
А ось тепер, починається "Магія".
7. Створюємо ще одну форму. Назвемо її "ФормаСчетаФактури".
8. Змінимо основний реквізит другий форми ( "ФормаСчетаФактури"): Змінимо найменування з "ОбработкаОб'ект" на "ДокументОб'ект", а тип з "ВнешняяОбработка.ВнешнійСчетФактураВиданний" на "ДокументОб'ект.СчетФактураВиданний". Звертаю вашу увагу, саме ДокументОб'ект!
9. У модулі форми оголосимо екпортно змінну "ВнОбработка". Вона буде містити об'єкт нашої зовнішньої обробки для доступу до макетів. Чому не реквізит? Тому що при використанні реквізиту, вона (обробка) залишалася в активній в підприємстві, навіть після закриття всіх вікон.
10. У модулі обробки в функції "Друк" додамо код:
ФормаСчетаФактури = ПолучітьФорму ( "ФормаСчетаФактури");
ФормаСчетаФактури. ДокументОб'ект = СчетФактураОб'ект;
ФормаСчетаФактури. ВнОбработка = ЕтотОб'ект;
ТабДок = ФормаСчетаФактури. ПечатьВнешнейФорми ();
Повернення (ТабДок);
КонецФункціі
11. Переносимо (методом копіювати / вставити) з модуля Документа в модуль форми "ФормаСчетаФактури" всі необхідні процедури. А їх треба сказати у Рахунки-фактури багато:
- ІніціалізаціяТабліциСтрок
- СобратьДанниеПоОтчетКомітентуОПродажах
- СобратьДанниеПоОтчетКоміссіонераОПродажах
- СобратьДанниеПоРеалізаціяТоваровУслуг
- СобратьДанниеПоВозвратТоваровПоставщіку
- СобратьДанниеПоПКО
- СобратьДанниеПоСВП
- СобратьДанниеПоПлатежномуОрдеру
- СобратьДанниеПоАкту
- СобратьДанниеПоПередачеОС
- СобратьДанниеПоПередачеНМАОрганізацій
- СобратьДанниеПоОтраженіюРеалізацііТоваровІУслуг
- СобратьДанниеПоРеалізаціяУслугПоПереработке
- СобратьДанниеПоПрінятіюКУчетуОС
- СобратьДанниеПоМодернізацііОС
- СобратьДанниеПоНачісленіеНДСпоСМРхозспособом
- СобратьДанниеСФнаАвансІСуммовуюРазніцу
- ПроставітьПрочеркіВПустиеПоля
- ПерезаполнітьСуммиПоУЕвРублях
- ПечатьСчетаФактури
Але нехай вас не лякає їх кількість. Як бачите більшість з них це "СобратьДанние.". І службові для друку. Також є функція "ПечатьСчетаФактури".
Варто зауважити що всі вони не експортні. Саме через це ми їх і копіювали.
Окрема розмова по перенесенню процедури Друк (.) З модуля документа.
Це найскладніший момент.
Перейменуємо її в ПечатьВнешнейФорми. Але мало того, переробимо її в функцію. Для цього замінимо всі "Повернення" на Повернення (Не визначено).
А виклик процедури в кінці модуля процедури
УніверсальниеМеханізми. НапечататьДокумент (ТабДокумент. КолічествоЕкземпляров. НаПрінтер. ОбщегоНазначенія. СформіроватьЗаголовокДокумента (ЕтотОб'ект. ЕтотОб'ект. Метадані (). Подання ()), НепосредственнаяПечать);
Також тепер нам не потрібні параметри: КолічествоЕкземпляров, НаПрінтер, НепосредственнаяПечать.
Та й параметр "ІмяМакета" нам неактуальний. Просто задамо його значення в тілі функції:
прибравши його з параметрів.
12. Залишилося замінити виклик загальних макетів на макети з обробки. Міняємо такі рядки
Макет = ПолучітьОбщійМакет ( ".") І макет = ПолучітьМакет ( ".")
Макет = ВнОбработка. ПолучітьМакет ( ".");
У нас є зовнішня друкована форма Рахунки-Фактури, з перенесеними в неї функціями і процедурами формування та макетами.
Зберігаємо. Ага - лається на "мНадпісьПредоплата". Дивимося в модулі документа - це змінна модуля об'єкта. Оголошуємо в нашій формі і присвоюється значення (як в модулі документа).
Перем ВнОбработка Експорт;
Перем мНадпісьПредоплата;
//. (Всі процедури і функції)
мНадпісьПредоплата = "Попередня оплата";
Октриваем в 1С підприємство і тестуємо!).
У функції ПечатьВнешнейФорми після рядків
Якщо ДанниеДляПечаті = Не визначено або ТіпЗнч (ДанниеДляПечаті) = Тип ( "Відповідність") Тоді
продовжити;
КонецЕсли
// Замінюємо у пресі "він же" на Організацію
Якщо ДанниеДляПечаті. Вантажовідправник = "він же" тоді
ДанниеДляПечаті. Вантажовідправник = ДанниеДляПечаті. організація;
КонецЕсли;
А ось тепер взагалі все! Міняємо як хочемо макети, отримання даних, формування друкованих форм.
PS. Обробку см у вкладенні.
Дополненіе1. Розглянуто "складний" приклад. Рахунок на оплату, накладна тощо друкуються ще легше, але принцип той же. Критика та зауваження вітаються.
Дополненіе2. Працює тільки на релізі платформи старше 8.1.11.
Дополненіе3. Довго думав над картинками. Так і не придумав.
Дополненіе4. При підключенні зовнішнього друкованої форми можна замістити їй штатну, щоб не напружувати користувачів вибором в діалозі (с) Поручик
Дополненіе5. Для тестування і налагодження зовнішньої друкованої форми замість створення спецформи в КОЖНІЙ обробці можна скористатися інструментом від poppy //infostart.ru/public/14686/ (с) artbear
А у мене не виникає.
Ну враховуючи, що друкована форма не зберігає об'єкт, а тільки перевіряє його. ну може бути так. У більшості випадків потрібно проведений або збережений документ. Але всеодно. Раз виникають питання, то треба б якось їх розтлумачити.
Я ж робив трошки не так:
- Брав необхідні процедури для формування друкованої форми;
- Для форми тестування-налагодження писав той же код, що описаний вище:
Процедура КнопкаВиполнітьНажатіе (Кнопка)
Друк (). Показати ();
КонецПроцедури
- А ось для використання як зовнішня друкована форма, іншим шляхом (ніяких об'єктів не отримував, ну не зустрів я поки випадку, щоб це було реально необхідно):
Запит = Новий запит;
.
Повернення Запрос.Виполніть ();
Функція Друк () Експорт
ТабДокумент = Новий ТаблічнийДокумент;
.
Вибірка = СформіроватьЗапросДляПечаті () .Вибрать ();
Макет = ЕтотОб'ект.ПолучітьМакет ( "МакетФорми");
.
Поки Виборка.Следующій () Цикл
Макет.Параметри.Заполніть (Вибірка);
.
ТабДокумент.Вивесті (Макет);
КонецЦікла;
Ось і виникає питання. Навіщо в типових друкованих формах реалізована ця перевірка?
Питання було поставлене за типовими друкованим формам. Ось саме за типовими у мене питань як правило не виникає.
А статтю читали? Або заголовок? Ось прям в заголовку написано, цитую: ". (Через підміну контексту)." Ось для того, щоб підмінити контекст форми нам і потрібно отримати об'єкт.
Адже все можна простіше зробити.
Знову ж процитую себе ж
Як показала практика, застосування цього способу виправдано лише в дуже рідкісних випадках. Але сам по собі спосіб ітересен в сенсі можливості виконання процедур і функцій, які будуть виконуватися в контексті іншого об'єкта.
І на скільки я зрозумів, ця обробка викликається шляхом виклику команди "Відкрити".
Ні, не правильно зрозуміли.
Загалом, наскільки я зрозумів ситуацію, ви на початку шляху освоєння 1С. Якщо так то, цю обробку можна сміливо не дивитися і не розбирати. Вона в звичайному додатку-то мала сумнівний сенс, а в керованому так взагалі втратила свій. ну коротше, неактуальна вона.
Якщо що, прошу вибачення за свій тон. Вже дуже сьогодні день важкий видався.