Казалось бы, что сложного? Но, по порядку!
Есть обработка, которая позволяет диспетчеру (назовем пользователя так), собрать в большую таблицу заказы покупателей на производимую продукцию на следующий день.
Таблица выглядит просто:
- в вертикальной в колонке заданы покупатели (сейчас где-то 200-300 контрагентов);
- в первой горизонтальной колонке задана производимая продукция (порядка 100 наименований).
Диспетчер работает один и все просто.
Разговор по телефону, диспетчер для покупателя пишет в таблице заказанное количество.
Периодически, раз в 10 минут (период задается) , таблица автоматически сохраняется на жестком диске в формате Excel. Обработку можно закрыть, снова открыть, восстановить из сохраненной копии последнее состояние заказов, продолжить собирать заказы. В любой момент можно пересчитать таблицу (подсчет итоговых значений по контрагентам и продукции). Все просто.
Восстановление таблицы занимает по времени около минуты.
Сохранение копии выполняется значительно быстрее.
Пересчет занимает около минуты.
Что надо? Организовать работу нескольких диспетчеров, чтобы они видели актуальное состояние таблицы заказа суммарно по всем диспетчерам.
Возникают проблемы:
1. Как хранить таблицу заказа. Если как сейчас, в Excel файле, много времени уходит на восстановление, пересчет, это замедляет оперативность работы. Если иначе, то как?
2. Как сохранять текущее состояние таблиц нескольких диспетчеров в одну общую. У каждого диспетчера таблица дополнена принятыми им заказами, надо сохранить заказы всех диспетчеров в одну общую таблицу.
Не приходилось мне решать такую задачку!
Надеюсь на обсуждение программистов ИС.
(1) Стресс-демо: 01.7z (946 953 byte) - используется файл mxl (43 129 044 byte) 1000 х 1000 ячеек, заполненных числами вида: 80008887 - прямой ввод, как в Excel, т.е. кликнули на ячеку, вводим, по [Enter] или при клике в другую ячеку изменения отображаются у других пользователей со скоростью обновления 1/25 сек (или около того). Пересчёта, автоматического сохранения, в т.ч. в формат Excel и детализации по пользователям нет, но и это возможно реализовать под конкретные условия задачи. Хотелось бы услышать отзывы тестеров, т.к. в логике учтены ещё не все нюансы.
(27)При разархивировании вывалилось:
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1Cv7.MD
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SBLOB.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SCONST.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SCRDOC.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SDNLOCK.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SJOURN.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SSYSTEM.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SUIDCTL.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SUSERS.DBF
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SBLOB.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SCONST.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SCRDOC.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SDNLOCK.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SJOURN.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1SUIDCTL.CDX
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1Cv7.CFG
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1Cv7.DD
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в ExtForms\1.ert
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в ExtForms\1.log
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1cv7flt.lst
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в ExtForms\1.mxl
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1CV7.ORD
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в 1CPP.dll
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в FormEx.dll
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Неизвестный метод в TableDoc.dll
! C:\Users\Борис\Downloads\1С\ТаблицаЗаказа\Временная\01.7z: Ошибка - сбой при операции
Для меня немного странная схема. Из Excel данные закачиваются в 1С и отображаются пользователю в виде таблицы значений. Затем с указанным интервалом сохраняются обратно в Excel. Я правильно понял? По моему должно быть - либо все в Excel, либо все в 1С. Почему недьзя просто всех пользователей посадить за Excel? Последние версии позволяют совместную работу над одним файлом.
Либо формировать таблицу значений по данным, хранящимся в 1С. Создать справочник или документ с такой же структурой, как файл Excel и работать с ним. Поскольку 1С не позволяет одновременную работу нескольких пользователей с одним справочником или документом, то решение формировать таблицу значений - правильное. К таблице значений подключить процедуру, чтобы она обновляла необходимые справочники или документы в режиме реального времени, сразу, как только пользователь обновит данные в своей таблице значений. А уж в Excel сбрасывать данные периодически или по нажатию кнопки "Экспорт", если это необходимо. Единственная сложная задача - обновлять таблицы значений у остальных пользователей при изменении её кем-то. Ведь обновлять нужно только изменённую ячейку, чтобы не потерялась работа других диспетчеров. Решается путём создания временной глобальной таблицы значений, в которых будут храниться пользователи, создавшие свой экземпляр таблицы заказов и сами таблицы заказов пользователей, как объект. Тогда любой пользователь с помошъю процедуры обновления данных сможет обновить таблицы заказов остальных пользователей. И не забыть включить режим транзакций, чтобы не было рассинхронизации.
Хранение в Excel таблицы надо только в архивных целях. После принятия всех заказов данные из таблицы обрабатываются с целью создания документов реализации, которые и записываются в базу данных. Дальше не нужна ни сама таблица, ни архивные файлы Excel.
Возможность работать с одной таблицей Excel - это очень интересно, если можно подробнее, какой для этого необходим Excel? Это могло бы решить все трудности!
(7) До практической реализации пока не добрался. Хотелось узнать как у "практика".
Работают два (или более) пользователя. Первый пользователь сразу видит изменения, внесенные другим пользователем? или после сохранения другим пользователем? или после сохранения первым пользователем? Короче, в какой момент изменения внесенные другими пользователями попадают на экран первого пользователя. Свои-то изменения он видит сразу!
Дополнительный регистр с двумя измерениями или забалансовый счет с 2мя субконто. Соответственно измерения/субконто контрагент и номенклатура. Можно до кучи третье субконто/измерение - Диспетчер.
+ документ, который двигает регистр или рисует проводки. Документ заполняется и создается вашей обработкой (можно допустим по документу на каждого диспетчера).
В конце дня когда все заказы собраны движения по счету/регистру удаляются.
На выходе получаете все текущие возможности + адекватную работу нескольких диспетчеров + работу отчетов по остаткам на текущий день, а при необходимости по старым документам (движений по ним уже не будет) можете "восстановить" план на любую дату.
(10) Не понятно, как разные диспетчеры будут видеть в своих таблицах, что сделали другие диспетчеры?
И сейчас могут работать несколько диспетчеров. Новым в вашем подходе является хранение результатов работы диспетчеров в "общем котле" - проводках или регистре. Это хорошо! Но как видеть оперативно, что какие-то покупатели уже "обработаны"?
(11) BorisBelov,
Сейчас обработка ваша тянет данные из Excel файла, а будет брать остатки по регистру/проводкам. Если важна оперативность, можно вешать на обработку ОбработкуОжидания с периодическим пересчетом остатков по регистру (либо по времени, либо по наступлению события "какой-то диспетчер обновил заказ", например).
Или под "обработаны" подразумевается что заказ увидели на складе/производстве? Увидели появившийся заказ - ткнули кнопку - движение по списанию заказа произошло. В документе тоже поставили флаг что заказ обработан.
Проводки по обработанным заказам в конце какого-то периода (день, неделя, месяц) просто удаляете (чтобы не разрасталась база).
(12) Обработка не "тянет данные из файла"! Практически диспетчер открывает обработку и начинает заполнять пустую таблицу. Автосохранение по обработке ожидания - страховой случай: отключили аварийно свет и проч. Ручное сохранение не делается, в этом нет необходимости: диспетчер работает за компьютером и ему никто не мешает. И, наконец, после сохранения таблица не меняется, ничего из файла "не тянется"!
Предложенный Вами подход периодически обновлять таблицы операторов, с которыми они работают, по остаткам регистров несомненно интересен. Остается проверить, сколько будет "съедаться времени" на обновление (записать свою таблицу и прочитать чужие).
Возможные коллизии при записи таблиц будут и при таком подходе и при использовании общей таблицы Excel.
(14) По порядку.
1. Сейчас диспетчер один. Его таблица сохраняется в файлах Excel с именами вида "25 Августа 2012 г. 20ч 43мин", в которых меняется дата и время сохранения.
2. В 1С таблица как таковая не хранится. После заполнения таблицы заказа диспетчер жмет кнопку "Создать документы" и обработка создает новые документы реализации и счета-фактуры, они хранятся в 1С. При закрытии обработки таблица заказа автоматом записывается в файл Excel, но практически она не нужна. Документы созданы и записаны.
Обсуждается переход к одновременной работе нескольких диспетчеров.
Борис, посидел, подумал над Вашей проблемой. Увидел для себя такой план:
1. Создаем форму с таблицей значений нужного формата и размера. Предусматриваем возможность ввода в ТЗ данных.
2. В процедуре ввода в эту ТЗ предусматриваем установку флага в файле или константе о необходимости обновить таблицы остальным операторам.
3. Также в процедуре ввода обновляем содержимым ТЗ внешний файл. Можно использовать ЗначениеВСтроку() и текстовый файл для хранения полученой строки.
4. Вешаем на форму обработку ожидания, которая проверяет флаг необходимости обновления и если он установлен загружает из него ТЗ на форму (ЗначениеИзСтроки() также упростит эту процедуру при обмене через текстовый файл).
5. При обновлении сохраняем метку о том, что такой-то пользователь выполнил обновление чтобы не обновляться повторно. Дополнительно проверяем все ли пользователи у которых открыта данная форма выполнили обновление и если это так то глобальную метку обновления снимаем, а также чистим метки обновления всех диспетчеров.
6. Сам список пользователей операторов и меток их обновления можно хранить списке значений, обновляя его в текстовом файле при открытии/закрытии формы нашей обработки.
У меня по подобной схеме 4 бухгалтера сверяют с кладовщиками остатки материалов в конце месяца. Так как материалов десятки тысяч позиций то тупое обновление по времени всей ТЗ сильно тормозило. Пришлось выдумать эту затею с флагами и метками, чтобы не гонять обновления впустую. Теперь работает с приемлемой скоростью, но может быть в Вашем случае просто периодическое обновление раз в 2-3 секунды будет терпимым.
Если говорить за организацию интерфейса именно в 1С, то идеально подходит ТабличноеПоле (1С++). В отличии от штатных 1С-ных контролов обновляется оно нормально.
А если база на SQL, или он под рукой есть, то ещё проще. Нинада регистров, и прочего - делаем свою табличку нужной структуры, и сами пишем/читаем.
Если придерживаться штатных средств (19), то сделать документ "Заказ" и таблицу в журнале "Заказы", а в Excel выгружать/изменять из документа в процедуре ПриЗаписи().
(21) Что из себя должен представлять документ "Заказ"?
Что такое "сделать таблицу в журнале "Заказы"?
Обычно в журнале 1С таблица вида "Документ, Номер, Дата..."
(32) Уже распаковал 7-zip. Запустил. Работает.
Если заявленные скорости реальны (в этом не сомневаюсь),
то до практической реализации осталось немного.