После первого раздела Польши часть крупных польских магнатов, недовольных новой конституцией Речи Посполитой, принятой в 1791 году, сформировали Тарговицкую шляхетскую конфедерацию, руководителем которой был избран Станислав Щенсный Потоцкий.
Тарговицкая конфедерация выступала за восстановление всех прежних феодальных порядков в Речи Посполитой. По просьбе конфедерации в пределы Речи Посполитой вошли русские войска.
Армия Речи Посполитой состояла из двух частей: коронной и литовской. Коронной армией командовал генерал-майор, князь Юзеф - Антоний Понятовский.
Коронная армия, разделенная на три дивизии, была расположена на Правобережной Украине. Дивизия под командованием генерал-лейтенанта Михаила Виельгорского была расквартирована под Чечельником.
Дивизия под предводительством генерал-майора Тадеуша Костюшки была расположена на границе со стороны Киева. Главные силы коронной армии Понятовский, расположил на квартиры под Тывровом, Брацлавом и Немировом.
На Волыни стояла дивизия под предводительством генерал-лейтенанта князя Михаила Любомирского (4,5 тыс.), который не подчинялся главнокомандующему Понятовскому.
В резерве находился корпус под руководством генерал-майора Юзефа Зайончека (5,5 тыс.).
10 мая Понятовский прибыл в Тульчин и начал концентрировать разрозненные отряды польских войск. Ему удалось собрать около 17 тыс. солдат, затем, уже в процессе боёв, в Заславле к нему присоединилась дивизия Любомирского и под Зеленцами резервный корпус генерала Зайончека.
В ночь на 19 мая польско-русскую границу перешли первые отряды 64-тыс. русской армии под командованием генерал-аншефа Михаила Васильевича Каховского. Его план предусматривал окружение Понятовского. Корпуса Вильгельма Христофоровича фон Дерфельдена (11,2 тыс.) и Ивана Петровича Дунина-Борковского (17,4 тыс.) должны были связать главные силы, а перерезать отходные пути должны были части Кутузова (23,6 тыс.) с юга и Андрея Яковлевича Леванидова (11,6 тыс.) с севера.
Понятовский не согласился с предложенной Костюшко тактикой обороны границы и решил отходить на Любар и Полонное, где используя складированные там припасы дать главное сражение. После ряда мелких стычек, небольших боёв и потери лагерей поляков ждала неудача. Склады в Полонном оказались недостаточными, а работы по строительству укреплений неоконченными. Поляки были вынуждены принять решение о продолжении отхода на соединение с дивизией Любомирского в Заславле, а что не удастся эвакуировать уничтожить в обозе под Полонным.
Вслед коронной армии двигалась11-тыс. армия генерала Ираклия Ивановича Моркова, усиленная казаками Василия Петровича Орлова. Морков планировал захватить польский лагерь и отрезать польские войска от Горыни. Уверенный что лагерь будет лёгкой добычей, Морков наткнулся под Зеленцами на прибывший накануне корпус под руководством Зайончека и Трокина.
17 июня Понятовский отошел к Шепетовке, где получил информацию о том, что дивизия Любомирского находится в Заславе. Он приказал Любомирскому присоединиться к его силам около Зеленцов. В Зеленцах польский отряд генерала Зайончека занял позицию на холме у дороги Полонное - Заслав. Его отряд насчитывал около 2 тысячи пехоты и тысячи всадников. Между тем Трокин и Зайончек не заняли село Зеленцы. Зайончек послал гонца к Понятовскому с просьбой поспешить на помощь.
В 6:00 утра русские силы численностью 6,2 тыс. человек пехоты при 40 орудиях и 4,8 тыс. кавалерии подошли в колоннах и под огнём польской артиллерии развернулись в боевой порядок на равнине, с конницей на флангах. В центре стояла пехота, два егерских и четыре гренадерских батальона, с егерским батальоном в резерве, и ещё одним батальоном и эскадроном конницы в охране лагеря. Пользуясь отсутствием польского сопротивления, русские заняли Зеленцы и начали под прикрытием села прицельный обстрел польских позиций.
В 7:00 на поле битвы с подмогой прибыл Понятовский. Левое крыло подпёр конный полк, правое — бригада народной кавалерии генерала Станислава Мокроновского, а центр усилило ещё два батальона пехоты и 12 орудий. Другие отряды прибывали в течение битвы и останавливались под прикрытием леса. В результате численность польских сил достигла 15,5 тыс. Дивизия Костюшко не подошла под Зеленцы, обеспечивая прикрытие от корпусов Дунина и Леванидова.
Учитывая обстрел со стороны села, Понятовский приказал село сжечь, что сыграло на руку русским. Дым заслонил полякам поле битвы, и русские под его маскировкой разбили кавалерию на правом крыле , которая вместо наступления на врага встретила атаку на месте, была разбита и обратилась в бегство.
Благодаря вмешательству князя Евстахия Сангушко и офицеров, кавалеристов удалось вернуть, русские всадники попали под сильный обстрел польской артиллерии. Далее по ним с фланга ударила народная кавалерия Станислава Мокроновского, вернувшаяся из бегства и желавшая смыть с себя позор, а с фронта их атаковала польская кавалерия второй линии. Русская конница не выдержала и отступила, потеряв флаг.
Для укрепления эффекта Понятовский приказал генералу Николаю Гуттен-Чапскому усилить натиск, но тот потребовал письменного приказа, ссылаясь на то, что устный непонятен. Таким образом, была утрачена возможность полностью разбить русское крыло.
После артиллерийской подготовки в центре, в атаку двинулись русские гренадеры, а три батальона польской пехоты, состоявшие преимущественно из новобранцев, не выдержав сильного обстрела и штыковой атаки русских, бросились бежать.
Убегая, пехота образовала брешь в центре, которую использовали русские, и вдобавок возникло замешательство в резервном польском батальоне. На помощь двинулся Понятовский во главе двух батальонов.
Несмотря на сильный обстрел польской артиллерии, русские гренадеры несколько раз поднимались в штыковые атаки, но без успеха, понесли потери от польского огня и были вынуждены отступить.
На левом крыле так же начался русский натиск, под нажимом которого поляки начали отступать. Когда русские подошли под огонь польской артиллерии, их удалось отогнать контратаками пехоты и занять прежние позиции.
Несмотря на сопротивление русских на всех участках фронта Понятовский решил перехватить инициативу, сформировав боевую группу из частей дивизии генерала Вельгорского. Польская конница оттеснила русских, но генерал Вельгорский, действовал нерешительно, благодаря чему Морков смог переформировать свои силы.
Русский генерал чувствовал себя не уверенно и посылал к Каховскому гонцов с просьбами о помощи. Не получив помощи Морков решил выходить с поля боя.
Примерно в 17:00 битва закончилась и поле боя осталось за поляками. Потери обеих сторон были приблизительно равными: поляки потеряли 800 человек, русские — 730. После отдыха, который длился 2 часа, отступление поляков на Заслав возобновилось. Поле боя вновь занял Морков, провозгласив себя победителем, за что получил орден Святого Георгия 2 степени.
Он перекрыл дорогу дивизии Костюшко которая подошла к месту битвы. Костюшко, оценив, что противник превосходит его по численности, отошёл, дав несколько артиллерийских залпов по русским позициям. На следующий день Костюшко присоединился к главным силам коронной армии под Заславом.
Поляки также объявили себя победителями. По предложению Юзефа Понятовского, король Станислав-Август учредил орден "Virtuti Militari", самый почётный военный орден Польши. Среди первых награжденных были сам Понятовский и Костюшко.
Но эта победа не остановила поход русских на Варшаву, и польское войско продолжило отступление. Попытки остановить русских, опираясь на крепость в Остроге были оставлены из-за угрозы окружения.
У поляков был еще один шанс дать бой под Дубно, но из-за нехватки припасов было решено отступать дальше на запад к линии Буга.