Прочитать метод недоступен на тонком клиенте

Обновлено: 04.07.2024

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

Клиент-Серверный вариант в управляемых формах.

1. Считываем данные из файла в массив из структур и затем этот массив передаем на сервер для дальнейших манипуляций с данными.

2-ой способ - это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.

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

В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.

На выходе получаем двумерный массив, который содержит все данные указанного листа Excel

Полезные функции при работе с Excel:

Устанавливает видимость Excel при работе
Добавление новой книги в файл Excel
Сохранение книги Excel
Добавление нового листа к книге
Переименование листа
Изменение маштаба листа
Изменение ориентации листа
Отступы листа
Обращение к ячейки
чтение/запись
Обращение к области ячеек
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой.
Объединение ячеек
Работа с именованными ячейками в Excel
Удаление ячейки
Удаление области ячеек
Обращение к строке
Изменение ширины колонки
Обращение к колонке
Удаление Строки
Фон ячейки / области / Строки /
Функция переводит цвет из формата RGB в формат Excel
Управление шрифтом в ячейки/строке/области
Р азрешает переносить по словам в ячейке
Управление рамкой ячейки
Устанавливаем формат ячейки
Формула в ячейки
Формула в ячейки
Формула в ячейки
Формула в ячейки
Функция для получения ширины колонки Excel
Спасибо пользователю goodwill
Разрешить перенос слов в ячейке
Спасибо пользователю roofless
Группировки данных на листе
Спасибо пользователю dr-wit, ignor

При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.

2. Работа с Excel через ТабличныйДокумент 1С

С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.

Итак, приступим: загрузка из Excel:

1. Загружаем файл Excel в табличный документ

2. Производим манипуляции уже с ТабличнымДокументом

Давайте теперь разберем сохранение в Excel с помощью данного метода:

Тут все очень просто сначала мы формируем обычный Табличный документ и затем записываем его в Excel

2. Работа с Excel ADODB

Выражаю особую благодарность коллеги Fragster за хороший комментарий

Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:

  1. Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
  2. Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.

Подключение к ADO

Отключение от ADO


Выполнение запроса

Пример запроса:

Запись в Excel тоже производится в виде запроса:

Хочу отметить что наименование полей производится по первой строке в таблице


ADODB предоставляет ряд объектов, с которыми мы работаем

ADODB.Recordset

В файле продемонстрированны оба варианта работы с запросами.

На этом пока все. По возможности буду дополнять статью :)

В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.

Макет = Справочники.Справочник1.ПолучитьМакет("Макет11");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник1.Месяц,
| Справочник1.Сумма
|ИЗ
| Справочник.Справочник1 КАК Справочник1";

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЦикла;

ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
ТабДок.Показать();
КонецПроцедуры

Тип: Строка. Заголовок окна редактирования.
<ИмяФайла> (необязательный)

Тип: Строка. Имя файла, в котором будет предлагаться сохранение текста при закрытии окна текстового редактора. Если файла с указанным именем не существует, то будет создан новый файл с таким именем для сохранения текста.
Если параметр не указан, но в окне редактирования после выполнения метода Показать были произведены изменения (интерактивно или средствами встроенного языка), то при его закрытии на экран выводится стандартный вопрос о сохранении документа.
Значение по умолчанию: Неопределено
Описание:

Открывает текст в текстовом редакторе 1С:Предприятия для просмотра и редактирования.

Тонкий клиент, веб-клиент, толстый клиент.Пример:

это на клиенте (&НаКлиенте)

ТабДок = Новый ТабличныйДокумент;

это на сервере
&НаСервере или &НаСервереБезКонтекста - в зависимости от необходимости в передаче контекста в вашем случае скорее всего без контекста

. заполняем таб
Макет = Справочники.Справочник1.ПолучитьМакет("Макет11");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник1.Месяц,
| Справочник1.Сумма
|ИЗ
| Справочник.Справочник1 КАК Справочник1";

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЦикла;

Распечатать

Как заполнить табличную часть формы программно?  6
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 10060 (0x0000274C): Попытка установить соединение была безуспешной  18
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 1C и Google Maps  20
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server  20
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П COM-подключение к базе 7.7 из 8.2 1С  6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D:ВашаБаза1с77" ; Пользователь= Посмотреть все результаты поиска похожих

Еще в этой же категории

Вывод картинки (изображения) на печать, в макет (табличный документ)  32
// 1-й вариант //Как вывести картинку в табличный документ? ТабДок = Новый ТабличныйДокумент; Макет = ОбработкаОбъект.ПолучитьМакет(" Макет" ); ОбластьКартинки = Макет.ПолучитьОбласть(" ОбластьСКартинкой" ); Картинка = Новый Картинка(ПутьККа Вывести табличный документ в PDF  18
Данный пример работает на платформе выше 8.2.13 Макет = ПолучитьМакет(" Макет" ); ОбластьШапка = Макет.ПолучитьОбласть(" Шапка" ); ТабДок = Новый ТабличныйДокумент; ОбластьШапка.Параметры.НомерДок = Номер; ОбластьШапка.Параметры.ДатаДок = Как в отобразить картинку в табличной части  7
В табличной части есть документы заявки от покупателя, нам нужно добавить картинку для отображения статуса документов заявка - проведен , не проведен, помечен на удаление. //Отобразим картинку Процедура СписокПриВыводеСтроки(Элемент, Оформление Вывод колонтитулов программно ВерхнийКолонтитул, НижнийКолонтитул  6
Колонтитул является специальным текстом, выводимым вверху или внизу каждой страницы при выводе документа на печать. В тексте колонтитула можно использовать следующие управляющие конструкции: > ( >) - при печати в данном месте будет выведен номер ст Функция загружает весь табличный документ в таблицу значений  6
// Вариант 1 // По переданному табличному документу возвращает таблицу значений, // при условии что в первой строке таблицы - идентификаторы колонок // Автор : dimoff Функция ПолучитьТЗИзМакета(ТабДок, КолонкаИндекса = 1) Экспорт ТаблицаДанн Посмотреть все в категории Табличный документ

Ни разу не постил на Хабр, а тут такой интересный повод нарисовался.

Вопросы, обсуждаемые в статье:

  • Выбрать публичность или приватность — вот в чем вопрос;
  • Кто главнее — клиент или сервер?
  • Прочтите статью и вы увидите, как на эти вопрос отвечает 1С в своей платформе;
  • И еще неожиданный интересный факт о Google узнают те, кто дочитает до конца;
  • Я кратко расскажу, как я нашел точного виновника бага.

История

Итак, сижу я вечером (на дворе как раз 13 декабря), тружусь над одним из своих любимых продуктов xUnitFor1C над значимым релизом 4.0

Тестирую работу тестов в режиме управляемого приложения при переходе с клиента на сервер и обратно.

Есть у нас один интересный и непростой сценарий поведения при использовании серверных тестов в режиме управляемого приложения на тонком клиенте.

В модуле контекста ядра тестирования (Упр.форма) созданы 2 похожих метода ВыполнитьТестовыйМетодНаКлиенте (признак &НаКлиенте) и ВыполнитьТестовыйМетодНаСервере (признак &НаСервере).
Назначение их понятно из названия.

Обычно в тесте я использовал метод УпрФорма.ВыполнитьТестовыйМетодНаКлиенте для проверки тестов УФ, т.е. через контекст управляемой формы.

Все штатно, проблем нет.

Но теперь мне понадобилось проверить переход с клиента на сервер. Я решил, что хватит использовать ВыполнитьТестовыйМетодНаКлиенте, пора заняться более глубоким хакингом и вызвал метод ВыполнитьТестовыйМетодНаСервере.

Написал специальный тест, описал поведение согласно сценария и внутри теста вызываю ЭтаФорма.ВыполнитьТестовыйМетодНаСервере.

Проходит несколько минут, и я с огромным изумлением вижу, что вызываемой мной метод ВыполнитьТестовыйМетодНаСервере является приватным, т.е. у него нет признака Экспорт!

При этом я его успешно вызываю, и он прекрасно отрабатывает.

Поиск и подтверждение бага в платформе 1С

Не верю своим глазам, ведь я много умных книжек читал, знаю много языков программирования, и понимаю, что приватный метод просто так вызвать нельзя.

Сначала я проверил, вызываю я правильный код из правильного места и т.д. Еще через пару минут я убедился, что ошибки нет, действительно, я вызываю приватный метод и он успешно отрабатывает!

Также я проверил, что метод ВыполнитьТестовыйМетодНаКлиенте является публичным/экспортным методом.

Согласно методикам поиска багов я максимально упростил ситуацию и исключил сторонние факторы:

создал отдельную внешнюю обработку. Добавил к ней простую управляемую форму.
Добавил 2 команды ВызовПриватногоКлиентскогоМетода и ВызовПриватногоСерверногоМетода
Для этой формы добавил следующий код:

Первоначально я запускал подобный ручной тест на свежайшей версии 8.3.7.1805 (выпущена 10.12.2015, если я не ошибаюсь).

: Метод объекта не обнаружен (ПриватнаяНаКлиенте)
ЭтаФорма.ПриватнаяНаКлиенте();

Далее я согласно тем же методикам поиска багов проверяю поведение на другой платформе 1С 8.2.19
Поведение абсолютно такое же.

Проверил поведение на встроенной обработке, те же проблемы.

Собственно, формулировка бага — сторонний код может вызвать приватный серверный метод управляемой формы через контекст управляемой формы, а приватный клиентский код таким образом вызвать нельзя.

Риторические вопросы

  • Получается, это не баг, это фича, потому что подобное «странное» поведение наблюдается очень давно, уже несколько лет?
  • А как же приватность/публичность? это же базовые принципы!
  • А как же инкапсуляция? получается, что кто угодно может вызвать скрытые серверные методы и нарушить поведение.
  • А как же равноправие? почему клиент настолько ущемлен по сравнению с сервером :) ?

В итоге этот баг сделал мой вечер!

Надеюсь, и вам понравилась указанная багофича.

Ух, как теперь можно развернуться кодерам на языке 1С, теперь можно экспорт не писать, все и без него работает.
Это же сколько кода можно наваять, если не тратить время на написание Экспорт! А в масштабах страны какая экономия времени?

А если более серьезно, то хочется обратиться к 1С для исправления данной ошибки.
Евангелист 1С PeterG, что скажешь?
Также предлагаю встроить в продукт АПК (Автоматизированная проверка конфигурации) проверку на подобный баг.

PS Если кому-то нужно, могу дать обработку для ручного тестирования.

PPS А если кому интересно, что же нового будет в версии 4.0 xUnitFor1C, ждите следующей статьи и новогоднего подарка!

Читайте также: