Расширение тестируемого поля формы для табличного документа.ЗаписатьСодержимоеВФайл

Методы · WriteContentToFile

Вызывает сохранение табличного документа в файл.

Синтаксис

ЗаписатьСодержимоеВФайл(<СохранитьКак>)
Полное описание, параметры и ограничения

Расширение тестируемого поля формы для табличного документа.ЗаписатьСодержимоеВФайл (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С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная конфигурация УчебнаяОтменаСохранения85 на8.5.1.1343, совместимость Не использовать, Русский, интерфейс Такси. Нет рабочих справочников, документов, регистров, общих реквизитов, расширений, подписок и заданий. Только свои формы/команда этого урока; модули вручную пустые до вставки приведённого кода.

  2. Конфигуратор → Общие формы → УчебнаяТаблицаТест85: реквизит МеткаСеанса Строка100, одиночное поле ввода МеткаСеанса с тем же путём и ТолькоПросмотр=Да; реквизит УчебныйДокумент типа ТабличныйДокумент, поле УчебнаяТаблица85 вида ПолеТабличногоДокумента с ПутьКДанным=УчебныйДокумент. Вставьте весь модуль fixture ниже; событие ПриСозданииНаСервере назначьте одноимённой процедуре.

  3. Общая команда ОткрытьУчебнуюТаблицу85: модуль ниже полностью открывает ОбщаяФорма.УчебнаяТаблицаТест85. Включите команду в интерфейс своей подсистемы УчебныеТесты85. Не создавайте похожую команду для рабочего отчёта. Будущая ручная подготовка: сохранить конфигурацию, обновить базу F7.

  4. Будущий ручной запуск ТОЛЬКО собственного стенда: первый отдельный тонкий клиент /TESTCLIENT -TPort15384, второй /TESTMANAGER. Собственный localhost-порт15384 заранее свободен и выделен только этому уроку; если выбран другой собственный порт, одинаково измените ручной ключ и конструктор. Здесь клиенты, порт и сетевое соединение не запускались.

  5. В своём /TESTCLIENT откройте ровно одну собственную форму общей командой. Скопируйте реально показанный МеткаСеанса UUID. В таблице обычным щелчком выберите только R2C1, ячейку Книга; не выделяйте диапазон или объединённый заголовок.

  6. Своя внешняя обработка УчебныйМенеджерТаблицы85 → новая управляемая Форма в /TESTMANAGER: реквизиты Согласие Булево, МеткаСеанса Строка100, Итог Строка1000. Видимые поля с этими путями, Итог ТолькоПросмотр=Да. Команда/кнопка ВыполнитьСвойТест, действие ВыполнитьСвойТест; ПриОткрытии назначьте одноимённой процедуре. Вставьте весь основной модуль, вставьте настоящую скопированную метку и подтвердите Согласие только своему тесту.

  7. Для этого отдельного урока Вывод собственного поля=Разрешить, Редактирование=Ложь. В других уроках вывод запрещён: тот запрет не переносить сюда. Документ только что создаётся в памяти, ИспользуемоеИмяФайла пусто.

  8. В source-форме добавьте реквизит ИмяСохранения85 Строка1000, одиночное поле с тем же внутренним именем/ПутьКДанным и ТолькоПросмотр=Да; команду/кнопку ОбновитьСвоёИмя85, действие ОбновитьСвоёИмя85. Полный обработчик приведён в fixture.

  9. Нужен новый собственный /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");
КонецПроцедуры

Разбор по шагам

  1. Через собственную source-кнопку читается ИспользуемоеИмяФайла и выводится в readonly-реквизит. Менеджер требует пустое имя ДО операции: он не принимает документ с уже известным чужим путём.

  2. Только после подтверждения собственной формы и исходной матрицы очищается очередь результатов диалога своего нового клиента. УстановитьРезультатДиалогаВыбораФайла(Ложь) ставится ПЕРЕД вызовом сохранения.

  3. ЗаписатьСодержимоеВФайл(Истина) инициирует Сохранить как. Native-Ложь означает отказ пользователя; имя файла и индекс фильтра при отказе игнорируются, поэтому не подставляются выдуманные значения.

  4. Очередь очищается после операции и на завершении. Собственная кнопка обновляет имя: оно должно остаться пустым. Все пять текстов/размер/объединение проверяются заново; выбор R2C1, фактический лимит и соединение восстанавливаются отдельно.

Как проверить результат

  1. Будущий результат: операция инициирует собственный диалог с отказом, исходное имя остаётся пустым, данные таблицы не меняются. Ошибка или открытый неотвеченный диалог не принимаются за успех.

  2. Будущий отрицательный контроль: в fixture задайте ИспользуемоеИмяФайла непустой учебной строкой и откройте новую собственную форму с новым UUID. Проверка должна остановиться ДО метода сохранения. Верните полный fixture после опыта.

  3. Этот урок показывает настоящий сценарий отмены API, не пример успешного создания файла. Успешную запись следует выполнять отдельно в явно собственный новый путь с другими условиями. Здесь файловые операции в1С не выполнялись.

Ожидаемый результат

Своё Сохранить как отменено native-Ложь; имя и таблица сохранены, очередь очищена, фактический лимит и соединение восстановлены

На что обратить внимание

  1. runtimeVerifiedScenarios=0: BSL, UI, клиенты тестирования, соединения, файлы и печать здесь не запускались. Это полные исходники для будущего ручного опыта только на своём стенде.

  2. Нужен новый отдельный /TESTCLIENT только этого урока, не рабочая конфигурация и не общий тестовый клиент. Настоящий UUID копируется из своей формы; ни похожие имена, ни новый выдуманный UUID не заменяют подтверждение источника.

  3. У разных уроков одинаковые имена модулей/форм/процедур, но разные точные имена конфигураций. Каждый урок готовится отдельно; модули не склеивать.

  4. Без предварительного native-ответа системный файловый диалог блокирует последующие действия менеджера до ручного закрытия. Поэтому порядок установки отказа и вызова строго фиксирован.

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

  6. Метод вызывается только с Истина. Ложь у СохранитьКак могла бы сохранять под текущим именем; такой вариант и реальная запись/перезапись не выполняются этим уроком.

  7. Пустое ИспользуемоеИмяФайла — проверка состояния UI, не самостоятельный аудит файловой системы. Не выдавайте её за доказательство отсутствия любого постороннего файла на диске.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.