Печать WORD из 1С, управляемого приложения (еще один вариант)

02.10.20

Учетные задачи - Печатные формы

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Печать WORD из 1С управляемое приложение (еще один вариант):
.epf 56,58Kb
55 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Печатная форма создавалась как заготовка для печати всевозможных кадровых документов из ЗУП 3.1 (3.1.15.40), версия платформы 1С:Предприятие 8.3 (8.3.16.1224). На ее основе очень просто создавать различные договоры, дополнительные соглашения, согласия на обработку персональных данных и прочих документов, которые постоянно меняются. Главное, что большую часть работы выполняет непосредственно кадровик или юрист, верстая образец в формате WORD. Наша задача взять этот образец, в нужных местах слова заменить параметрами и сохранить в макетах печатной формы в качестве двоичных данных.

ШАГ 1 Создание внешней печатной формы.

В модуле обработке добавляем стандартные функции и процедуры

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

В этой функции важно что  "ВызовКлиентскогоМетода". То есть печать происходит на клиенте.

В модуле печатной формы (модуль объекта) добавляем также стандартные ПолучитьТаблицуКоманд() и

ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ""), а также пустую процедуру печать

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

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


Шаг 2. Открываем форму обработки. Переходим в модуль формы. Добавляем Функцию печать на клиенте. Она имеет только два параметра ИдентификаторКоманды и ОбъектыНазначения. Нам интересен второй параметр ОбъектыНазначения. Это список значений, куда передана ссылка на документ, из которого мы печатаем файл.

&НаКлиенте
Функция Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт   

Дата = ТекущаяДата();    
    Номермакета = ""+Год(Дата)+""+ Месяц(Дата)+""+День(Дата)+""+Час(Дата)+""+Минута(Дата)+""+Секунда(Дата);
    МассивДоков = ПолучитьМассивДоков(ОбъектыНазначения);
    for each Результат in МассивДоков do
        ОткрытьФайлПриложением( Результат.АдресХранилища,  "Мат. ответственность"+НомерМакета);
        НомерМакета = НомерМакета + 1;
    EndDo;     

КонецФункции

Но сделать нужный нам запрос обращаясь к документу на форме мы не можем. Ругается, что полученное значение не является объектным. Здесь я не сразу сообразил, что делать, пока не перенес нужный мне запрос в модуль обработки с передачей туда параметра ОбъектыНазначения. Там я смог получить из ОбъектовНазначения нужные мне параметры для передачи в запрос. И обратно получил уже результат запроса.

Для этого сначала передал данные в серверную функцию

&НаСервере
Функция ПолучитьМассивДоков(ОбъектыНазначения)
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Выборка = ОбработкаОбъект.ПолучитьЗапросНаСервере(ОбъектыНазначения);
	МассивД = New Array;
	
	While Выборка.Следующий() Do
		
		Результат = ВывестиМакетНаСервере(Выборка);
		If Результат = Undefined then
			continue;
		endIf;

		МассивД.Добавить(Результат);
	EndDo; 	
	return МассивД; 	
КонецФункции


Которая уже сделала нужный запрос к данным

Функция ПолучитьЗапросНаСервере(ОбъектыНазначения) Экспорт
    Запрос = New Query;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СотрудникиОрганизаций.Сотрудник КАК Сотрудник,
    |    КадроваяИсторияСотрудниковИнтервальный.Должность КАК Должность,
    |    СотрудникиОрганизаций.ФизическоеЛицо КАК ФизЛицо,
    |    ПриемНаРаботу.Сотрудник.Код КАК ТабельныйНомер,
    |    ПриемНаРаботу.ТрудовойДоговорНомер КАК ДоговорНомер,
    |    ПриемНаРаботу.Должность КАК ДолжностьПриема,
    |    ПриемНаРаботу.ТрудовойДоговорДата КАК ДоговорДата,
    |    ПриемНаРаботу.ГрафикРаботы КАК ГрафикРаботы,
    |    ПриемНаРаботу.ДатаПриема КАК ДатаПриема,
    |    ПриемНаРаботу.КоличествоСтавок КАК КоличествоСтавок,
    |    ПриемНаРаботу.ДолжностьРуководителя КАК ДолжностьРуководителя,
    |    ПриемНаРаботу.Руководитель КАК Руководитель,
    |    ПриемНаРаботу.Организация КАК Организация,
    |    ПриемНаРаботу.Организация.ОГРН КАК ОрганизацияОГРН,
    |    ПриемНаРаботу.Организация.НаименованиеСокращенное КАК ОрганизацияНаименованиеСокращенное,
    |    ПриемНаРаботу.Организация.НаименованиеПолное КАК ОрганизацияНаименованиеПолное,
    |    ПриемНаРаботу.Организация.ИНН КАК ОрганизацияИНН,
    |    ПриемНаРаботу.Организация.РегистрацияВНалоговомОргане.КПП КАК ОрганизацияКПП,
    |    ПриемНаРаботуНачисления.Размер КАК Оклад,
    |   ПаспортныеДанныеФизЛиц.Серия КАК ПаспортСерия,
    |   ПаспортныеДанныеФизЛиц.Номер КАК ПаспортНомер,
    |   ПаспортныеДанныеФизЛиц.ДатаВыдачи КАК ДатаВыдачи,
    |   ПаспортныеДанныеФизЛиц.КемВыдан КАК КемВыдан,
    |   ПаспортныеДанныеФизЛиц.КодПодразделения КАК КодПодразделения,
    |   ПаспортныеДанныеФизЛиц.Представление КАК ПредставлениеПаспорта,
    |   ПриемНаРаботу.Ссылка.Номер КАК ПриказНомер,
    |   ПриемНаРаботу.Ссылка.Дата КАК ПриказДата,
    |    ЮрАдресОрганизации.Представление КАК ЮрАдресОрганизации,
    |    ЮрАдресОрганизации.Город КАК Город,
    |    ПочтовыйАдресОрганизации.Представление КАК ПочтовыйАдресОрганизации,
    |    АдресПоПропискеФизЛицо.Представление КАК АдресПоПропискеФизЛица,
    |    АдресПроживанияФизЛицо.Представление КАК АдресПроживанияФизЛица
    |
    |
    |ИЗ
    |    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК СотрудникиОрганизаций
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц КАК ПаспортныеДанныеФизЛиц
    |    ПО СотрудникиОрганизаций.ФизическоеЛицо = ПаспортныеДанныеФизЛиц.ФизЛицо
    |   ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу
    |   ПО СотрудникиОрганизаций.Сотрудник = ПриемНаРаботу.Сотрудник
    |   ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу.Начисления КАК ПриемНаРаботуНачисления
    |   ПО СотрудникиОрганизаций.Сотрудник = ПриемНаРаботуНачисления.Ссылка.Сотрудник
    |    И ПриемНаРаботуНачисления.Начисление.Наименование = &ОплатаПоОкладу
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК АдресПоПропискеФизЛицо
    |    ПО (СотрудникиОрганизаций.ФизическоеЛицо = АдресПоПропискеФизЛицо.Ссылка)
    |        И (АдресПоПропискеФизЛицо.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (АдресПоПропискеФизЛицо.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица))
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК АдресПроживанияФизЛицо
    |    ПО (СотрудникиОрганизаций.ФизическоеЛицо = АдресПроживанияФизЛицо.Ссылка)
    |        И (АдресПроживанияФизЛицо.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (АдресПроживанияФизЛицо.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица))
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
    |    ПО СотрудникиОрганизаций.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ЮрАдресОрганизации
    |    ПО (ПриемНаРаботу.Организация = ЮрАдресОрганизации.Ссылка)
    |        И (ЮрАдресОрганизации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (ЮРАдресОрганизации.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации))
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ПочтовыйАдресОрганизации
    |    ПО (ПриемНаРаботу.Организация = ПочтовыйАдресОрганизации.Ссылка)
    |        И (ПочтовыйАдресОрганизации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (ПочтовыйАдресОрганизации.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации))
    |
    |
    |ГДЕ
    |    СотрудникиОрганизаций.Сотрудник = &Сотрудник";
    
    
    Запрос.УстановитьПараметр("ДатаУвольнения", ТекущаяДата());
    Запрос.УстановитьПараметр("ОплатаПоОкладу", "Оплата по окладу");
    Запрос.УстановитьПараметр("Сотрудник", ОбъектыНазначения.Получить(0).Сотрудник);
    Запрос.УстановитьПараметр("ПодразделениеОрганизации", ОбъектыНазначения.Получить(0).Подразделение);
    Запрос.УстановитьПараметр("ПустаяДата", '00010101');
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат Выборка;
КонецФункции

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

 

Дальше, с помощью функции

&НаСервере
Функция ВывестиМакетНаСервере(Выборка)
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
//    ДокОбъект = Ссылка.ПолучитьОбъект();
    // Получили параметры шаблонов
    ПараметрыЗаполненияШаблона = Новый Структура;
    ПараметрыЗаполненияШаблона.Вставить("РазделительЛевый","<");
    ПараметрыЗаполненияШаблона.Вставить("РазделительПравый",">");
    
    // Получили макет
    ВременныйФайл = ПолучитьИмяВременногоФайла("docx");
    Если Выборка.Организация.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
        ОбработкаОбъект.ПолучитьМакет("СправкаИП").Записать(ВременныйФайл);
    Иначе
        ОбработкаОбъект.ПолучитьМакет("Справка").Записать(ВременныйФайл);
    КонецЕсли;
    
    // Получили данные к выводу
    ДанныеКВыводу = ДанныеКВыводу(Выборка);
    
    
    //Результат - Структура имеет параметр "АдресХранилища" и параметры файла такие как размер, расширение
    Результат = ОбработатьФайлDocx(
    ВременныйФайл,
    ПараметрыЗаполненияШаблона,
    ДанныеКВыводу
    );
    
    Возврат Результат
КонецФункции


и ряда вспомогательныз функций, относящихся к обработке файлов WORD как файлов, имеющих в своей основе MXL вывел файл на экран в формате WORD.

 

&НаСервере
Функция ВывестиМакетНаСервере(Выборка)
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
//    ДокОбъект = Ссылка.ПолучитьОбъект();
    // Получили параметры шаблонов
    ПараметрыЗаполненияШаблона = Новый Структура;
    ПараметрыЗаполненияШаблона.Вставить("РазделительЛевый","<");
    ПараметрыЗаполненияШаблона.Вставить("РазделительПравый",">");
    
    // Получили макет
    ВременныйФайл = ПолучитьИмяВременногоФайла("docx");
    Если Выборка.Организация.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
        ОбработкаОбъект.ПолучитьМакет("СправкаИП").Записать(ВременныйФайл);
    Иначе
        ОбработкаОбъект.ПолучитьМакет("Справка").Записать(ВременныйФайл);
    КонецЕсли;
    
    // Получили данные к выводу
    ДанныеКВыводу = ДанныеКВыводу(Выборка);
    
    
    //Результат - Структура имеет параметр "АдресХранилища" и параметры файла такие как размер, расширение
    Результат = ОбработатьФайлDocx(
    ВременныйФайл,
    ПараметрыЗаполненияШаблона,
    ДанныеКВыводу
    );
    
    Возврат Результат
КонецФункции


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

Вступайте в нашу телеграмм-группу Инфостарт

Печатная форма WORD управляемое приложение.

См. также

Печатные формы Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

В публикации представлен шаблон обработки для формирования документов MS Word по данным информационной базы с комментариями и пояснениями

1 стартмани

18.05.2012    31815    670    bahbah    23    

69

Печатные формы Управление взаимоотношениями с клиентами (CRM) Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 Россия Абонемент ($m)

Обработка для печати договоров с контрагентами. Подходит для торговли 10.3.* практически без необходимости вносить в конфигурацию базы серьезные изменения. Достаточно лишь подкорректиовать макет договора в обработке, заполнить данные организации и все! Шаблон договора готов.

1 стартмани

16.05.2012    31595    262    ItIstok    11    

18

Печатные формы Зарплата Учет рабочего времени Кадровый учет Программист Бухгалтер 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 2.5 1С:Зарплата и кадры бюджетного учреждения Россия Бухгалтерский учет Бюджетный учет Абонемент ($m)

Внешние печатные формы (Т-1, Т-1А, Т-5, Т-5А, Т-6, Т-6А, Т-7, Т-8, Т-8А, Т-9, Т-9А, Т-10, Т-10А, Т-11, Т-11А, Трудовой договор, Постоянные начисления, Ввод постоянного начисления или удержания, Возврат на работу, Табель форма 0504421) Формы которые присутствуют в конфигурации типовые. Добавленные формы: Постоянные начисления, Ввод постоянного начисления или удержания, Возврат на работу.

1 стартмани

22.04.2012    75201    1670    Tokiy    55    

63

Печатные формы Оптовая торговля Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 Россия Бухгалтерский учет НДС Абонемент ($m)

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

1 стартмани

19.04.2012    23178    138    andrey1312    9    

11

Печатные формы Документооборот и делопроизводство (СЭД) 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 Россия Абонемент ($m)

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

1 стартмани

19.04.2012    37641    311    andrey1312    10    

29

Пакетная печать Печатные формы Кадровый учет Бухгалтер 1С:Предприятие 8 1С:Управление производственным предприятием Россия Абонемент ($m)

Согласие работника на обработку персональных данных. Внешняя печатная форма для конфигурации Зарплата и Управление персоналом 8.2 "Согласие работника на обработку персональных данных". Подключается к справочнику сотрудники через меню сервис/внешние отчеты и обработки/Дополнительные печатные формы - необходимо указать принадлежность печатной формы(справочник "Сотрудники").

1 стартмани

06.04.2012    36026    81    kurmanov    14    

20

Печатные формы Кадровый учет Программист Бухгалтер 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Зарплата и Управление Персоналом 2.5 1С:Управление производственным предприятием Россия Бухгалтерский учет Абонемент ($m)

Моя переработанная статья будет полезна и работникам кадровых служб и разработчикам кадровых отчетов. Вся информация для пользователей размещена в самом начале статьи, ниже идет техническое описание сбора данных для отчета. К статье прикреплен отчет на основе СКД, который позволяет в детальной и настраиваемой форме выводить информацию о состояниях сотрудников за выбранный период. Данные собираются исключительно с кадровых регистров. Через механизм характеристик реализована поддержка использования категорий и свойств объектов. В описании для разработчиков я расскажу об основных принципах создания отчета по состояниям (отклонениям) сотрудников организаций за выбранный период. Данные будем брать из регистров сведений «СостояниеРаботниковОрганизаций» и «РаботникиОрганизаций». В файлах выложен полностью работоспособный отчет по статье, который можно быстро адаптировать под Ваши учетные задачи. (тестировалась в ЗУП 2.5.37.1, 2.5.54.1 / 8.2.14.533, 8.2.15.310)

1 стартмани

21.12.2011    52640    728    RailMen    54    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. suepifanov 1224 02.10.20 15:16 Сейчас в теме
и ряда вспомогательныз функций, относящихся к обработке файлов WORD как файлов, имеющих в своей основе MXL вывел файл на экран в формате WORD
.
наверное xml, а не mxl.. Алгоритм работы с word взяли из этой публикации - https://infostart.ru/public/675307/ ?
2. user810754 24 02.10.20 21:47 Сейчас в теме
Да, действительно xml. Эту публикацию не читал, алгоритм взят из другого источника, на авторство не претендую. Хотя вообщем-то он стандартный, и секретом не является.
3. G_112708749323588293243 06.07.22 17:08 Сейчас в теме
обработка не работает


Ошибка при вызове метода контекста (КопироватьФайл)
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(607)}:КопироватьФайл(ДанныеФайла.Текст,ВременныйФайлКопия);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(935)}:Результат = ОбработатьФайлDocx(
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(966)}:Результат = ВывестиМакетНаСервере(Выборка);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(950)}:МассивДоков = ПолучитьМассивДоков(ОбъектыНазначения);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(10)}:ПечатьСправки(ОбъектыНазначения);

по причине:
Ошибка копирования файлов
по причине:
Ошибка копирования файлов из 'C:\Users\M_Latifov\AppData\Local\Temp\ec9d1280-c818-4b4a-8d88-5a09810bdf44\word\document.xml' в 'C:\Users\M_Latifov\AppData\Local\Temp\v8_FD81_1e3.xml' : Каталог не обнаружен
Для отправки сообщения требуется регистрация/авторизация