Вызывает сохранение табличного документа в файл.
Синтаксис
ЗаписатьСодержимоеВФайл(<СохранитьКак>)Полное описание, параметры и ограничения
Расширение тестируемого поля формы для табличного документа.ЗаписатьСодержимоеВФайл (Tested form field extension for a spreadsheet document.WriteContentToFile)
Расширение тестируемого поля формы для табличного документа (Tested form field extension for a spreadsheet document)
ЗаписатьСодержимоеВФайл (WriteContentToFile)
Доступен, начиная с версии 8.3.8.
Синтаксис:
ЗаписатьСодержимоеВФайл(<СохранитьКак>)
Параметры:
<СохранитьКак> (необязательный)
Тип: Булево.
Истина - отображает диалоговое окно "Сохранить как" для выбора имени файла.
Ложь - сохраняет файл под текущим именем.
В зависимости от значения свойства Редактирование расширения поля формы для поля табличного документа, диалог сохранения в файл может быть отображен независимо от значения данного свойства.
Значение по умолчанию: Ложь.
Описание:
Вызывает сохранение табличного документа в файл.
Доступность:
Тонкий клиент, толстый клиент.
Примечание:
Из-за особенностей реализации веб-клиента метод применим только при тестировании тонкого клиента.
Использование в версии:
Доступен, начиная с версии 8.3.8.
Описание изменено в версии 8.3.25.
Методическая информация
Практические примеры
Отменить Сохранить как собственной таблицы через клиент тестирования
Перед вызовом настоящего API сохранения задаём native-результат диалога Ложь. Проверяем неизменённый собственный документ и пустое имя сохранения; файловый путь и индекс фильтра не выдумываются.
Где и как запускать
Полный отдельный модуль формы менеджера тестирования собственного тонкого клиента и два полных supporting-модуля для создания/открытия своей таблицы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная конфигурация УчебнаяОтменаСохранения85 на8.5.1.1343, совместимость Не использовать, Русский, интерфейс Такси. Нет рабочих справочников, документов, регистров, общих реквизитов, расширений, подписок и заданий. Только свои формы/команда этого урока; модули вручную пустые до вставки приведённого кода.
Конфигуратор → Общие формы → УчебнаяТаблицаТест85: реквизит МеткаСеанса Строка100, одиночное поле ввода МеткаСеанса с тем же путём и ТолькоПросмотр=Да; реквизит УчебныйДокумент типа ТабличныйДокумент, поле УчебнаяТаблица85 вида ПолеТабличногоДокумента с ПутьКДанным=УчебныйДокумент. Вставьте весь модуль fixture ниже; событие ПриСозданииНаСервере назначьте одноимённой процедуре.
Общая команда ОткрытьУчебнуюТаблицу85: модуль ниже полностью открывает ОбщаяФорма.УчебнаяТаблицаТест85. Включите команду в интерфейс своей подсистемы УчебныеТесты85. Не создавайте похожую команду для рабочего отчёта. Будущая ручная подготовка: сохранить конфигурацию, обновить базу F7.
Будущий ручной запуск ТОЛЬКО собственного стенда: первый отдельный тонкий клиент /TESTCLIENT -TPort15384, второй /TESTMANAGER. Собственный localhost-порт15384 заранее свободен и выделен только этому уроку; если выбран другой собственный порт, одинаково измените ручной ключ и конструктор. Здесь клиенты, порт и сетевое соединение не запускались.
В своём /TESTCLIENT откройте ровно одну собственную форму общей командой. Скопируйте реально показанный МеткаСеанса UUID. В таблице обычным щелчком выберите только R2C1, ячейку Книга; не выделяйте диапазон или объединённый заголовок.
Своя внешняя обработка УчебныйМенеджерТаблицы85 → новая управляемая Форма в /TESTMANAGER: реквизиты Согласие Булево, МеткаСеанса Строка100, Итог Строка1000. Видимые поля с этими путями, Итог ТолькоПросмотр=Да. Команда/кнопка ВыполнитьСвойТест, действие ВыполнитьСвойТест; ПриОткрытии назначьте одноимённой процедуре. Вставьте весь основной модуль, вставьте настоящую скопированную метку и подтвердите Согласие только своему тесту.
Для этого отдельного урока Вывод собственного поля=Разрешить, Редактирование=Ложь. В других уроках вывод запрещён: тот запрет не переносить сюда. Документ только что создаётся в памяти, ИспользуемоеИмяФайла пусто.
В source-форме добавьте реквизит ИмяСохранения85 Строка1000, одиночное поле с тем же внутренним именем/ПутьКДанным и ТолькоПросмотр=Да; команду/кнопку ОбновитьСвоёИмя85, действие ОбновитьСвоёИмя85. Полный обработчик приведён в fixture.
Нужен новый собственный /TESTCLIENT без незавершённых системных файловых диалогов, без других тестов/пользователей/очередей. Здесь Согласие разрешает только тест отказа своего диалога. Не запускайте другие команды сохранения во время опыта.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Сначала подготовьте свою таблицу и выберите только R2C1";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если Не Согласие Тогда
ВызватьИсключение "Разрешите только тест своей таблицы без редактирования, файлов и печати";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Скопируйте фактическую метку своего открытого клиента тестирования";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция НайтиСвоюТаблицу(Приложение)
Заголовок = "Учебная таблица85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Должна быть одна фактически открытая собственная форма";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Метка = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "МеткаСеанса", 10);
Если Метка.ПолучитьПредставлениеДанных() <> МеткаСеанса Тогда
ВызватьИсключение "Не подтверждена настоящая метка собственной таблицы";
КонецЕсли;
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебнаяТаблица85", 10);
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> "УчебнаяТаблица85"
Или Поле.Вид <> ВидПоляФормы.ПолеТабличногоДокумента Тогда
ВызватьИсключение "Нужно своё поле именно вида ПолеТабличногоДокумента";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственное поле должно быть видимым и доступным для выбора ячейки";
КонецЕсли;
Возврат Поле;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоюМатрицу(Поле)
Если Поле.ПолучитьРазмерОбластиДанныхДокументаПоВертикали() <> 3
Или Поле.ПолучитьРазмерОбластиДанныхДокументаПоГоризонтали() <> 2 Тогда
ВызватьИсключение "Свой документ должен иметь последние данные в строке3 и колонке2";
КонецЕсли;
Если Поле.ПолучитьТекстОбласти("R1C1") <> "Учебная таблица85"
Или Поле.ПолучитьТекстОбласти("R2C1") <> "Книга"
Или Поле.ПолучитьТекстОбласти("R2C2") <> "3"
Или Поле.ПолучитьТекстОбласти("R3C1") <> "Ручка"
Или Поле.ПолучитьТекстОбласти("R3C2") <> "1" Тогда
ВызватьИсключение "Все пять текстов собственной таблицы должны совпасть полностью";
КонецЕсли;
Объединение = Поле.ВходитВОбъединеннуюОбласть("R1C1");
Если ТипЗнч(Объединение) <> Тип("Строка") Или Объединение <> "R1C1:R1C2" Тогда
ВызватьИсключение "Заголовок должен входить именно в собственную объединённую область";
КонецЕсли;
Если Поле.ВходитВОбъединеннуюОбласть("R2C1") <> Неопределено Тогда
ВызватьИсключение "Ячейка Книга не должна быть объединена";
КонецЕсли;
Если Поле.ТекущийРежимРедактирование() Тогда
ВызватьИсключение "Не начинайте редактировать собственную таблицу этого урока";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
ПроверитьСвойСтенд();
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15384);
Поле = Неопределено;
ИсходныйЛимит = Неопределено;
СвояОбластьПодтверждена = Ложь;
СвояОчередьИспользована = Ложь;
Ошибка = "";
Итог = "Проверка ещё не завершена";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
Поле = НайтиСвоюТаблицу(Приложение);
ПроверитьСвоюМатрицу(Поле);
Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
ВызватьИсключение "До старта вручную выберите одну собственную ячейку Книга, R2C1";
КонецЕсли;
СвояОбластьПодтверждена = Истина;
СвояФорма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), "Учебная таблица85 " + МеткаСеанса, , 10);
Обновить = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "ОбновитьСвоёИмя85", 10);
ИмяСохранения = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "ИмяСохранения85", 10);
Обновить.Нажать();
Если ИмяСохранения.ПолучитьПредставлениеДанных() <> "" Тогда
ВызватьИсключение "Свой новый документ не должен иметь прежнего имени сохранения";
КонецЕсли;
СвояОчередьИспользована = Истина;
Приложение.ОчиститьРезультатДиалогаВыбораФайла();
Приложение.УстановитьРезультатДиалогаВыбораФайла(Ложь);
Поле.ЗаписатьСодержимоеВФайл(Истина);
Приложение.ОчиститьРезультатДиалогаВыбораФайла();
Обновить.Нажать();
Если ИмяСохранения.ПолучитьПредставлениеДанных() <> "" Тогда
ВызватьИсключение "После отказа диалога имя собственного документа должно остаться пустым";
КонецЕсли;
ПроверитьСвоюМатрицу(Поле);
Исключение
Ошибка = ОписаниеОшибки();
КонецПопытки;
Если СвояОбластьПодтверждена Тогда
Попытка
Если СвояОчередьИспользована Тогда
Приложение.ОчиститьРезультатДиалогаВыбораФайла();
КонецЕсли;
Поле.УстановитьТекущуюОбласть("R2C1");
Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
ВызватьИсключение "Не восстановлена подтверждённая исходная ячейка";
КонецЕсли;
ПроверитьСвоюМатрицу(Поле);
Исключение
Ошибка = Ошибка + " Восстановление собственной области: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
Ошибка = Ошибка + " Восстановление фактического лимита: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
Ошибка = Ошибка + " Разрыв собственного соединения: " + ОписаниеОшибки();
КонецПопытки;
Если Ошибка <> "" Тогда
Итог = "Свой тест не завершён: " + Ошибка;
ВызватьИсключение Итог;
КонецЕсли;
Итог = "Своё Сохранить как отменено native-Ложь; имя и таблица сохранены, очередь очищена, фактический лимит и соединение восстановлены";
КонецПроцедурыУчебнаяТаблицаТест85
Конфигуратор → Общие формы → УчебнаяТаблицаТест85 → Модуль
Полный самостоятельный модуль управляемой общей формы: создание собственной таблицы на сервере; не выполнялся.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтотОбъект.АвтоЗаголовок = Ложь;
ЭтотОбъект.Заголовок = "Учебная таблица85 " + МеткаСеанса;
Документ = Новый ТабличныйДокумент;
Заголовок = Документ.Область(1, 1, 1, 2);
Заголовок.Объединить();
Заголовок.Текст = "Учебная таблица85";
Документ.Область(2, 1).Текст = "Книга";
Документ.Область(2, 2).Текст = "3";
Документ.Область(3, 1).Текст = "Ручка";
Документ.Область(3, 2).Текст = "1";
Документ.Область(1, 1, 3, 2).ШиринаКолонки = 30;
Документ.ТолькоПросмотр = Истина;
УчебныйДокумент = Документ;
Элементы.УчебнаяТаблица85.ИспользуемоеИмяФайла = "";
ИмяСохранения85 = "";
Элементы.УчебнаяТаблица85.Редактирование = Ложь;
Элементы.УчебнаяТаблица85.Вывод = ИспользованиеВывода.Разрешить;
Элементы.УчебнаяТаблица85.РазрешитьНачалоПеретаскивания = Ложь;
Элементы.УчебнаяТаблица85.РазрешитьПеретаскивание = Ложь;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСвоёИмя85(Команда)
ИмяСохранения85 = Элементы.УчебнаяТаблица85.ИспользуемоеИмяФайла;
КонецПроцедурыОткрытьУчебнуюТаблицу85
Конфигуратор → Общие команды → ОткрытьУчебнуюТаблицу85 → Модуль
Полный модуль собственной общей команды с ОбработкаКоманды; не выполнялся.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебнаяТаблицаТест85");
КонецПроцедурыРазбор по шагам
Через собственную source-кнопку читается ИспользуемоеИмяФайла и выводится в readonly-реквизит. Менеджер требует пустое имя ДО операции: он не принимает документ с уже известным чужим путём.
Только после подтверждения собственной формы и исходной матрицы очищается очередь результатов диалога своего нового клиента. УстановитьРезультатДиалогаВыбораФайла(Ложь) ставится ПЕРЕД вызовом сохранения.
ЗаписатьСодержимоеВФайл(Истина) инициирует Сохранить как. Native-Ложь означает отказ пользователя; имя файла и индекс фильтра при отказе игнорируются, поэтому не подставляются выдуманные значения.
Очередь очищается после операции и на завершении. Собственная кнопка обновляет имя: оно должно остаться пустым. Все пять текстов/размер/объединение проверяются заново; выбор R2C1, фактический лимит и соединение восстанавливаются отдельно.
Как проверить результат
Будущий результат: операция инициирует собственный диалог с отказом, исходное имя остаётся пустым, данные таблицы не меняются. Ошибка или открытый неотвеченный диалог не принимаются за успех.
Будущий отрицательный контроль: в fixture задайте ИспользуемоеИмяФайла непустой учебной строкой и откройте новую собственную форму с новым UUID. Проверка должна остановиться ДО метода сохранения. Верните полный fixture после опыта.
Этот урок показывает настоящий сценарий отмены API, не пример успешного создания файла. Успешную запись следует выполнять отдельно в явно собственный новый путь с другими условиями. Здесь файловые операции в1С не выполнялись.
Ожидаемый результат
Своё Сохранить как отменено native-Ложь; имя и таблица сохранены, очередь очищена, фактический лимит и соединение восстановлены
На что обратить внимание
runtimeVerifiedScenarios=0: BSL, UI, клиенты тестирования, соединения, файлы и печать здесь не запускались. Это полные исходники для будущего ручного опыта только на своём стенде.
Нужен новый отдельный /TESTCLIENT только этого урока, не рабочая конфигурация и не общий тестовый клиент. Настоящий UUID копируется из своей формы; ни похожие имена, ни новый выдуманный UUID не заменяют подтверждение источника.
У разных уроков одинаковые имена модулей/форм/процедур, но разные точные имена конфигураций. Каждый урок готовится отдельно; модули не склеивать.
Без предварительного native-ответа системный файловый диалог блокирует последующие действия менеджера до ручного закрытия. Поэтому порядок установки отказа и вызова строго фиксирован.
Очистка результатов диалога касается очереди своего изолированного клиента, не удаления файлов. Нельзя применять этот код к общему клиенту, где кто-то уже поставил свои ответы диалогов.
Метод вызывается только с Истина. Ложь у СохранитьКак могла бы сохранять под текущим именем; такой вариант и реальная запись/перезапись не выполняются этим уроком.
Пустое ИспользуемоеИмяФайла — проверка состояния UI, не самостоятельный аудит файловой системы. Не выдавайте её за доказательство отсутствия любого постороннего файла на диске.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.