Здравствуйте.

Задача:
Необходимо написать процедуру, которая будет получать письма с почтового сервера с отбором по дате, отправителю, получателю.

Коротко цель задачи - выбрали контрагента, подгрузили все письма от него (а также от его конт. лиц), к нему (а также к его конт. лицам) от любого пользователя компании. Посмотрели, закрыли.

Примечания:
1. Через ИнтернетПочта не работает, потому что не работают отборы в ПолучитьИдентификаторы и ПолучитьЗаголовки. А получать все письма нет возможности , писем около 50 000, 1С умирает.

2. По идее нужно решать через COMОбъект("Outlook.Application").
Пробовал получать папки olFolderInbox и olFolderOutbox, все замечательно получается, но:
2.1. не знаю как получать письма всех пользователей оутлука (могу получить только текущего пользователя)
2.2. не знаю как получить письма отбором, не хотелось бы получать все письма, потом обходить их.

В теории если уж совсем не известно как решить, помогите хотя бы с 2.1., а дальше отбором будем отбирать письма по адресам, хоть так...
---
Скорее всего придется загружать частями. Это точно не скажу, т.к. с таким объемом не работал - у меня обрабатывается, как правило, до 100 писем за раз в 1С8.2 и до 300 в 1С7.7.

Насчет неработающего отбора вспомнил: примерно с версии 8.2.16, или что-то в этом роде (сейчас стоит 8.2.19), 1С перестал заполнять заголовок письма. Пришлось для определения отправителя выбирать все письма, смотреть отправителя и его адрес. А до этого, фильтр работал. Поэтому проблема - косяк платформы стопудово.
И то, есть еще один нюанс, с которым до сих пор не разобрался: когда у меня письма приходят от двух поставщиков (всего от двух из примерно 80), 1С8.2 все равно не видит адрес отправителя. Приходится письма вручную из почтовика (BAT) перенаправлять, и только после этого работает. Это скорее всего связано со способом отправки письма самим поставщиком, только я не нашел разницы, хотя и просматривал письма вручную (на почтовом сервере), сравнивал заголовки писем и мне различия в глаза не бросились.

Так что, будь готов и к таким неожиданным казусам и косякам встроенного в 1С8.2 почтового клиента.
Удачи.
---
А какое отношение это имеет к 1C?
---
Данная задача решена в конфигурации ITIl
---
2. Читаем задачу.
3. Спасибо, но покупать эту конфигурацию ради одной задачи не имеет смысла.
---
2.1 Переключайтесь между пользователями и загружайте, таким образом от всех поьлзователей. Правда могут дубли повылазить, если некоторые письма адресованы нескольким пользователям.
---
5. Я не знаю как программно через MAPI переключить пользователя.
---
потому что не работают отборы в ПолучитьИдентификаторы и ПолучитьЗаголовки.
Вы имели в виду у Вас не работает или вообще? потому что у меня работает...
---
jigourt,
А можно пример работающего отбора? А также версию платформы, почтовый сервер (провайдер).

(18) Все проблемы как у вас. Из нашей практики: у нас почта должна храниться на сервере 3 месяца. Далее грохается. У топовых пользователей объем до 10 тысяч писем. Делаем через ПолучитьЗаголовки() (без параметров) и сравниваем с хранимыми в базе по идентификаторам (IMAP). Далее получаем только несуществующие в базе.
Криво и долго.
Оптимизировали регламентным заданием получение почты. По крайней мере у пользователей теперь не висит окошко "получение почты" две минуты.
Но вопрос остается. На текущей платформе 8.3.4.389 тоже не работает
---
7. Насколько я понимаю это баг 1С, как минимум на 8.2. В моем случае не работает.
---
Как это делал я:

Пользователю в оутлуке добавлял необходимые ящики (админ в помощь)

В программе:

Обходишь ящики и выбираешь только нужные.

Письма: отбираем элементы по интервалу функцией Restrict() (ей же можно задавать параметры поиска)
далее циклом в отобранных искал по требуемым параметрам. И хранил идентификатор письма для загруженных.

З.Ы.:
MSDN в помощь... MSDN
---
Честно говоря не очень понял:

Пользователю в оутлуке добавлял необходимые ящики - я не знаю как поменять пользователя
под которым происходит коннект к кому оутлука. А все пользователям нельзя дать все ящики.
---
Если очень нада могу скинуть конфу Итиля там глянешь. Сейчас на ней работаю, искать где там этот кусок кода нет времени.
---
Автор, получилось хоть что-нибудь?

(11), Можно конфой Итиль поделиться?
---
Может поможет. Получение непрочтенных писем на текущую дату. 1С 8.1

```1c
    olFolderInbox = 6;
    Попытка
    objOutlook = Новый COMОбъект("Outlook.Application");
    Исключение
    objOutlook = 0;
    Предупреждение("Не удалось создать объект Outlook.Application. Outlook установлен на компьютер?");
    Возврат;
    КонецПопытки;

    objNamespace = objOutlook.GetNamespace("MAPI");
    objFolderInbox = objNamespace.GetDefaultFolder(olFolderInbox);
    colMails = objFolderInbox.Items.Restrict("[unread] = true");
    Для каждого mail из colMails Цикл
    ...
    КонецЦикла;

    //закрываем соединение
    Попытка
    objNamespace.Logoff();
    objOutlook.Quit();
    Исключение
    КонецПопытки;
    objOutlook = 0;

    ЭлементыФормы.ТаблицаДанных.ОбновитьСтроки();
```
---
11 - очень надо )
12 - примерно тоже самое я и использую, но как раз проблемы описанные
тут и возникают:
"2.1. не знаю как получать письма всех пользователей оутлука (могу получить только текущего пользователя)
2.2. не знаю как получить письма отбором, не хотелось бы получать все письма, потом обходить их."
---
Если пойти другим путем:
1. Создать подсистему хранения писем в 1С (в типовых конфигурация есть). Для данной задачи можно урезать очень сильно.
2. Получать все письма и сохранять их в базе данных
3. По запросу выдавать пользователям

Плюсы:
1. Отбор будет работать гораздо быстрее (на порядок), чем читать письма с сервера или outlook
2. При сохранении письма в 1С, удалять его с сервера - получение по расписанию будет делаться быстро (будет оставаться небольшое количество писем)
3. Проще отслеживать проблемы с фильтрами, получением и т.д.

Минусы:
1. В базе будет храниться большой объем информации

Выбор за Вами. Я по схожему алгоритму сделал автоматическую загрузку документов от поставщиков. Работает в 1С 7.7 (только в базе хранятся не письма, а уже загруженные документы).
---
Дополнительные плюсы:
4. Письма под контролем у Вас, а не админа почтового сервера

а для хранения достаточно одного справочника (или документа) - как удобнее.
плюс две обработки: получение и показ с фильтром.
По-хорошему, это делается за 1 рабочий день.
---
14.15. - спасибо за совет, но насколько я понимаю ваш вариант подразумевает удаление писем с почтового сервера,
что означает они будут недоступны через оутлук. Клиент против такого варианта, потому что
вся компания кроме 1С еще и активно пользуется оутлуком. Сам по себе оутлук, как почтовый клиент
намного удобнее 1С. Получается, что удалять письма нельзя, а если нельзя удалить, то такой вариант не получится
использовать ввиду п.1 "Через ИнтернетПочта не работает, потому что не работают отборы в ПолучитьИдентификаторы и ПолучитьЗаголовки. А получать все письма нет возможности , писем около 50 000, 1С умирает."
---
Не удалять с сервера - как хотите, только надо понимать, что 50000 - это сейчас, через месяц будет 60000 и т.д. Тут ни один почтовый клиент и сервер такую кучу не обработают. Рано или поздно эти письма должны удаляться. Чем - 1С или outlook'ом - без разницы.
Тогда:
1. при получении в 1С, письма не удаляются с сервера.
2. в 1С хранится ID письма - чтобы при следующей проверке почтового ящика не загружать дубли.

Вариант 2 (то же опробованный, только работает у меня наоборот - письма копируются в ящик для программиста, чтобы в случае утери письма можно было его восстановить):
1. На почтовом сервере заводится новый почтовый ящик для 1С
2. В этот ящик копируются все нужные письма (средствами самого сервера), а оригиналы отправляются далее (для использования в outlook)
3. 1С читает письма из своего почтового ящика и регулярно его чистит

Можно придумать еще что-нибудь в этом роде.
---
17. Ну Оутлук с такой кучей вроде как работает без особых проблем.
Ведь каждый пользователь имеет доступ не сразу ко всем письмам...

Вариант 1 - невозможно загрузить первичные письма с сервера, при попытке
выбрать средствами 1С 50 000 писем она падает. Как средствами 1С отобрать письма
непонятно, потому что функции не работают.

Вариант 2 - в принципе возможный, единственный минус это пухнущая база 1С.
Пока этот вариант рассматриваю как самый разумный если не найдется другого.
Опять же остается правда вопрос как загрузить первоначальные письма, если только можно средствами
оутлук их запулить в этот ящик по частям и загружать частями...
---
Скорее всего придется загружать частями. Это точно не скажу, т.к. с таким объемом не работал - у меня обрабатывается, как правило, до 100 писем за раз в 1С8.2 и до 300 в 1С7.7.

Насчет неработающего отбора вспомнил: примерно с версии 8.2.16, или что-то в этом роде (сейчас стоит 8.2.19), 1С перестал заполнять заголовок письма. Пришлось для определения отправителя выбирать все письма, смотреть отправителя и его адрес. А до этого, фильтр работал. Поэтому проблема - косяк платформы стопудово.
И то, есть еще один нюанс, с которым до сих пор не разобрался: когда у меня письма приходят от двух поставщиков (всего от двух из примерно 80), 1С8.2 все равно не видит адрес отправителя. Приходится письма вручную из почтовика (BAT) перенаправлять, и только после этого работает. Это скорее всего связано со способом отправки письма самим поставщиком, только я не нашел разницы, хотя и просматривал письма вручную (на почтовом сервере), сравнивал заголовки писем и мне различия в глаза не бросились.

Так что, будь готов и к таким неожиданным казусам и косякам встроенного в 1С8.2 почтового клиента.
Удачи.